本文示例针对puppet自身模块,详细解读模块的结构及语法应用,通过本例的学习,可以掌握puppet模块应用的技能,为自动化应用打下坚实基础。
下面就以agent为例分步测试
1 创建puppet模块目录结构
[root@master ~]# cd /etc/puppet/modules/ #进入模块主目录
[root@master modules]# mkdir puppet #创建puppet模块主目录
[root@master modules]# cd puppet
[root@master puppet]# mkdir files manifests templates #创建模块目录结构
[root@master puppet]# tree ../puppet
../puppet
├── files #存放下载的文件
├── manifests #存放puppet配置
└── templates #存放配置模板,方便pp文件引用
2 创建模块puppet配置文件
[root@master puppet]# cd manifests
[root@master manifests]# touch init.pp config.pp install.pp params.pp service.pp
[root@master manifests]# tree ../
../
├── files
├── manifests
│ ├── config.pp #管理模块puppet配置
│ ├── init.pp #管理模块所有pp文件配置
│ ├── install.pp #管理puppet应用安装
│ ├── params.pp #管理模块中变量以及一些判断
│ └── service.pp #管理puppet服务
└── templates
3 编写模块配置文件
整个过程是这样的,首先应该安装puppet(install.pp),然后配置puppet(config.pp),最后启动puppet服务(service.pp)
3.1 编辑init.pp
[root@master manifests]# vim init.pp
class puppet{ #创建模块puppet类
include puppet::install #包含子类install,可以是install.pp文件,也可以直接写入本文件
}
3.2 编辑install.pp
注意:class名称要和创建的模块名保持一致,名称为puppet,由于在整个配置文件中init.pp为起始配置文件,包含的都应该是子配置文件,所有应该写成“class主类名称::class子类名称”,而class子类名称需要和创建的pp文件名保持一致,比如puppet::install,那么创建的子类名称就应该是install.pp
[root@master manifests]# vim install.pp
class puppet::install{ #包含下面两个子类
include puppet::puppet_install,puppet::facter_install
}
class puppet::puppet_install{
package { 'puppet':
ensure => installed, #处于被安装状态
}
}
class puppet::facter_install{
package { 'facter':
ensure => installed,
}
}
也可以写成下面格式
[root@master manifests]# vim install.pp
class puppet::install{ #一个类包含两个资源
package { 'puppet':
ensure => installed,
}
package { 'facter':
ensure => installed,
}
}
具有判断版本的写法
[root@master manifests]# vim install.pp
class puppet::install{
include puppet::puppet_install,puppet::facter_install
}
class puppet::puppet_install{
package { 'puppet':
ensure => $operatingsystemmajrelease ?{ #判断系统版本
5 => '2.7.25-1.el5',
6 => '2.7.25-1.el6',
}
}
}
class puppet::facter_install{
package { 'facter':
ensure => $operatingsystemmajrelease ?{
5 => '1.7.5-1.el5',
6 => '1.7.5-1.el6',
}
}
}
3.3 编辑site.pp
将模块应用到agent上
[root@master ~]# vim /etc/puppet/manifests/site.pp
$master = 'master.puppet.com'
node 'master_cert.puppet.com'{
include test,puppet
}
node 'agent1_cert.puppet.com'{
include test,puppet
}
node 'agent2_cert.puppet.com'{
include test,puppet
}
node 'agent3_cert.puppet.com'{
include test,puppet
}
所有节点都使用相同的模块,也可以是以下写法
[root@master ~]# vim /etc/puppet/manifests/site.pp
$master = 'master.puppet.com'
class environments{
include motd,puppet
}
node default{
include environments
}
简单测试
[root@agent1 ~]# puppet agent -t --noop #通过--noop进行尝试性测试,可以看到节点变化情况
3.4 编写config配置
编写params.pp文件,增加certname变量
[root@master manifests]# vim params.pp
class puppet::params {
$puppetserver = 'master.puppet.com' #增加puppetserver变量指向master名称
case $hostname{ #增加certname变量
agent1: {
$certname = 'agent1_cert.puppet.com'
}
agent3: {
$certname = 'agent3_cert.puppet.com'
}
default: { #设置默认不存在的情况下报错
fail("certname is not supported on ${::operatingsystem}")
}
}
}
编写puppet.conf.erb模板
puppet的erb模板的存在是为了解决每个节点单独配置一个文件的问题,因为erb模板可以引用fact变量,变量的内容会根据节点系统的不同而变化。
[root@master manifests]# vim ../templates/puppet.conf.erb
### config by puppet ###
[main]
logdir = /var/log/puppet
rundir = /var/run/puppet
ssldir = $vardir/ssl
[agent]
classfile = $vardir/classes.txt
localconfig = $vardir/localconfig
server = <%= scope.lookupvar('puppet::params::puppetserver') %> #引用变量puppetserver
certname = <%= scope.lookupvar('puppet::params::certname') %> #引用变量certname
runinterval = 10
编写config.pp
[root@master manifests]# vim config.pp
class puppet::config{
include puppet::params #添加引用关系,
file { '/etc/puppet/puppet.conf': #节点文件存放的路径
ensure => present, #要求存在
content => template('puppet/puppet.conf.erb'), #要求根据模板生成,路径写法为相对路径(templates目录隐藏掉)
owner => 'root', #要求文件属主为root
group => 'root', #要求文件属组为root
mode => '0644', #要求文件权限为644
require => Class['puppet::install'], #要求这个文件在配置之前先正确运行install.pp文件,也就是说要求puppet的包应当处于安装状态
}
}
3.5 编写service.pp文件
[root@master manifests]# vim service.pp
class puppet::service{
service { 'puppet':
ensure => running, #设置puppet服务一直处于运行状态
hasstatus => true, #通过标准的命令“service server_name status"进行检查状态
hasrestart => true, #设置puppet服务具有标准的restart命令
enable => true, #要求开机自动启动,其实通过chkconfig设置puppet状态为on
}
}
3.6 更新config.pp文件,增加通知服务重启功能
[root@master manifests]# vim config.pp
class puppet::config{
include puppet::params
file { '/etc/puppet/puppet.conf':
ensure => present,
content => template('puppet/puppet.conf.erb'),
owner => 'root',
group => 'root',
mode => '0644',
require => Class['puppet::install'],
notify => Class['puppet::service'], #配置更新后主动通过puppet服务重启
}
}
3.7 添加class puppet::service puppet::config到init.pp中
[root@master manifests]# vim init.pp
class puppet{
include puppet::install,puppet::config,puppet::service
}
结语:配置文件编辑完成后,可在agent上测试是否正常,到此,模块完整结构已经详细分步展示,每一步后均可以自我调整测试,依照这种模块结构,可以移植到其他模块应用,语法上也可以尝试多变,配置有很强的灵活性。