Puppet 核心概念
本书的重点是讲解 PuppetOpenstack 项目,并假定读者对于 Puppet 有一定的了解,因此将不会包含对于 Puppet 基础知识的讲解。
然而,在 Puppet 中有一些非常重要的概念,对于这些核心概念的准确理解,将有助于读者快速掌握 Puppet Modules 的开发,因此,本节将花费一些篇幅来帮助读者深入理解这些核心概念。
0. Resource Type
在 Linux 中,一切皆文件( file
)。而在 Puppet 中,一切皆资源( resource
)。
比如,package 对应着 软件包
资源类型(resource type)。
在服务器上安装 vim 软件包,相应地声明一个 package 资源:
package {'vim':
ensure => present
}
在服务器上管理 ntp 服务,相应地声明一个 service 资源:
service {'ntpd':
ensure => running
}
在 Puppet 中,常用的资源类型有以下 8 类:
- file
- package
- service
- modify
- exec
- cron
- user
- group
0.1 资源声明
资源声明(Resource declaration)则是一个表达式,用于描述资源的期望状态并将其添加到 Catalog。
可以理解为类似于编程语言中的函数调用。
1. Class
与面向对象语言不同,类( Class ) 在 Puppet 中只是表示了一个代码块:通常将一些相关的功能组合到一起,并存储到 module 中,以便后期使用。
1.1 类的定义
定义一个 Class 的语法格式如下:
- 以
class
关键字开头 - 指定一个类的名称
- 参数列表(可选)
- 一对花括号
- 至少含有一个资源声明的代码块
例如,以下是一个关于 apache 的 Class :
class apache (String $version = 'latest') {
package {'httpd':
ensure => $version, # Using the class parameter from above
before => File['/etc/httpd.conf'],
}
file {'/etc/httpd.conf':
ensure => file,
owner => 'httpd',
content => template('apache/httpd.conf.erb'), # Template from a module
}
service {'httpd':
ensure => running,
enable => true,
subscribe => File['/etc/httpd.conf'],
}
}
1.2 Class 文件的存放位置
Class 定义文件应存放在 modules 的 manifests 目录下,Puppet 将自动地加载该路径下的所有类。
1.3 类的声明
在 Puppet manifest 文件中声明一个 Class 时,则会将其添加到 catalog 文件。通常在节点定义文件中或者其他 class 文件中去声明一个 Class 。
在 Puppet 中,有两种方式来声明一个 Class :
- 类 Include 方式
- 类 Resource 声明方式
1.3.1 Include 方式
Include 方式是指使用 include
, require
, contain
, hiera_include
函数来声明 Class ,使用这种方式 Class 可以安全地被多次声明。
例如:
class compute(){
include ::nova
include ::nova::api
}
node 'compute_node' {
include compute
# nova 类被声明了 2 次
include ::nova
}
何谓安全地多次声明?
任何一个 Class 在一个指定节点的定义中,只能被声明一次,否则 Puppet 在运行时会抛出资源重复声明的错误。这也是初学者容易犯错的地方。
而通过类 include 的方式可以实现尽管 Class 被多次声明,但最终只向 catalog 添加一次的效果。
但使用这种方式,则 Class 中的参数传值只能通过 Hiera 进行。
1.3.2 Class 方式
Class 的方式则要求每个被声明的 Class 只被声明一次。通过这种方式,在声明某个特定 Class 的时候,可以对指定参数进行重新赋值。
例如:
class compute($ip='127.0.0.1'){
class {'nova':
ipaddress => $ip
}
class {'nova::api':}
}
node 'compute_node' {
class{'compute':
ip => '192.168.1.1'
}
}
2.Defines
Defines 也称为是 Defined resource type,是一段可以被多次赋值的代码块,可以理解为是一种轻量级的自定义的资源类型。
例如,以下是 nova::manage:network define,用于管理 nova network 的创建。在实际使用中,可以通过传递不同的参数给 nova::manage::network 来创建不同的 nova network。
define nova::manage::network (
$network,
$label = 'novanetwork',
$num_networks = 1,
$network_size = 255,
$vlan_start = undef,
$project = undef,
$allowed_start = undef,
$allowed_end = undef,
$dns1 = undef,
$dns2 = undef
) {
include ::nova::deps
nova_network { $name:
ensure => present,
network => $network,
label => $label,
num_networks => $num_networks,
network_size => $network_size,
project => $project,
vlan_start => $vlan_start,
allowed_start => $allowed_start,
allowed_end => $allowed_end,
dns1 => $dns1,
dns2 => $dns2,
}
}
初学者在选择如何 define 和 class 时,常常犹豫不决。
首先,来看这两种类型的最大区别:
- Define:在一个 catalog 中可以被重复声明
- Class : 在一个 catatlog 中只能被声明一次
再谈使用场景:
- Class 通常用于管理具有唯一性的资源
- Define 通常用于管理具有多样性的资源
以 Apache 为例,会使用 Class 来管理 Apache 软件包,主配置文件,以及服务状态的管理;而 Apache vhost 则会使用 Define 来管理。我们会在后面
puppet-apache
章节中详细讲解。
3. Nodes
假设你已经下载了 puppet-apache 和 puppet-mysql 模块,接下来要为指定服务器赋予指定的角色,那么这个过程称为是节点分类(Node Classification)。 在 Puppet 中,这些数据通常存储在节点定义文件中。
节点定义文件的存放路径通常位于 <ENVIRONMENTS DIRECTORY>/<ENVIRONMENT>/manifests/site.pp
。
现在我们要配置 2 种类型的节点:Web 服务器 www.example.com
和 DB 服务器 db1.example.com
,在 site.pp 中加入以下代码:
node 'www.example.com' {
include apache
}
node 'db.example.com' {
include mysql
}
最佳实践
尽管在节点定义文件里可以添加任何的 Puppet 代码,但请保持只在节点定义文件中做两件事情:声明类和设置变量。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论