作者:刁冰雪
时间:2018-02-02
一、核心类型——PACKAGE
典型案例说明
1、使用latest将软件持续安装为最新版
使用yum源安装软件时,package类型提供了两种软件安装的方式,present和latest。使用present参数实现软件安装时,仅确保该软件存在即可,不关注版本,只有该软件不存在时才会进行安装。而使用latest参数实现软件安装时,当软件源中的安装包有版本更新时,latest则会自动将软件升级为最新的版本。对于工具类软件,建议使用latest保持最新版本;对于运行环境,如python、java则建议使用present避免自动升级可能发生的兼容性问题。
配置说明
class smallflow::test {
package {
["tree"]:
ensure => "latest",
}
}
2、使用provider属性通过rpm安装软件时,该软件包必须处于本地目录
source中的路径需为本机地址,因此若本地路径不存在该安装软件包时,需要通过file方法将安装包传递到agent本机。此处不可通过source指定master端的路径实现远程安装。
配置说明
class smallflow::test {
file {"/tmp/tree-1.5.3-3.el6.x86_64.rpm":
owner => "root",
group => "root",
mode => "0644",
source => "puppet:///modules/smallflow/tree-1.5.3-3.el6.x86_64.rpm",
}
package {"tree":
ensure => "present",
provider => "rpm",
source => "/tmp/tree-1.5.3-3.el6.x86_64.rpm",
}
}
二、核心类型——FILE
典型案例说明
1、使用file类型传输文件时,file可以自己对文件是否存在做出判断,当agent端路径下存在相同文件时,file将不再执行文件传输的操作。
配置说明
class smallflow::tomcat {
file {"/tmp/testfile.txt":
ensure => "present",
owner => "root",
group => "root",
mode => "0644",
source => "puppet:///modules/smallflow/testfile.txt",
}
}
客户端agent2测试
2、当file属性ensure的参数为directory时创建文件夹,与recurse属性为remote一同使用时可递归创建文件夹及其中文件;当ensure参数为link时,可以为target中的目标文件建立软链接,而不必通过exec来执行ln -s命令实现文件链接
通过file类型中ensure属性选择directory可以直接在指定目录下创建文件夹,若该文件夹已经存在则不会再次执行文件夹创建的操作。
配置说明
class smallflow::tomcat {
file {"/export/servers":
ensure => "directory", #创建/export/servers文件夹
owner => "admin",
group => "admin",
mode => "0755",
}
}
配置说明
class resource_init::cleaner {
file {"/export/servers/sky-cleaner":
ensure => "directory", #创建/export/servers文件夹
recurse => "remote",
owner => "admin",
group => "admin",
mode => "0755",
source => "puppet:///modueles/resource_init/export/servers/sky-cleaner";
}
}
配置说明
class smallflow::link {
file{"/mnt/lpasswd":
owner => "root",
group => "root",
ensure => "link",
target => "/mnt/passwd", #创建软连接
}
}
3、file通过使用notify来触发目标exec的执行
通过notify与refreshonly配合使用来实现触发下游操作的执行
如下示例:EXEC[checkmd5]中refreshonly值为true,因此file传输文件时可通过notify来触发EXEC[checkmd5]执行,如下图中红色框中显示。
配置说明
class smallflow::test {
file { "/tmp/apache-tomcat-8.0.30.tar.gz":
ensure => "present",
owner => "root",
group => "root",
mode => "755",
source => "puppet:///modules/smallflow/apache-tomcat-8.0.30.tar.gz",
notify => "Exec[tar -zxvf apache-tomcat-8.0.30.tar.gz]", #文件传输时触发Exec[tar -zxvf apache-tomcat-8.0.30.tar.gz]的执行
}
exec {
"tar -zxvf apache-tomcat-8.0.30.tar.gz":
user => "admin",
cwd => "/tmp",
path => "/usr/bin:/usr/sbin:/sbin:/bin",
provider => "shell",
timeout => "60",
refreshonly => "true", #配合file中notify同时使用,参数值为true时,notify所在的类型执行时该类型中命令方可执行
}
}
notify与refreshonly组合说明
notify | refreshonly | action |
---|---|---|
true | true | notify所在file执行成功时,refreshonly所在exec方可执行 |
true | false | 不论notify所在file是否执行,refreshonly所在exec均执行 |
true | – | 不论notify所在file是否执行,refreshonly所在exec均执行 |
4、file属性backup与filebucket共同使用实现文件备份与恢复
要实现文件的备份,需要在file类型中使用backup类型,在site.pp中添加filebucket类型。filebucket存储文件有两种方式:远程server和本地local。我们使用的是本地存储,以免server端负载过高。通过本地filebucket恢复上一版本文件时,使用如下命令:puppet filebucket restore –bucket 本地备份路径 要恢复的文件 文件上一版本MD5值,
使用举例:puppet filebucket restore –bucket /tmp/backup /etc/hosts f9520612cf79cbb5fc7acce12e3b5ab2
配置说明
class smallflow::test {
file { "/tmp/apache-tomcat-8.0.30.tar.gz":
ensure => "present",
owner => "root",
group => "root",
mode => "755",
source => "puppet:///modules/smallflow/apache-tomcat-8.0.30.tar.gz",
backup => main; #设置backup,备份方式为site.pp中设置的main方式
}
}
#site.pp设置
node default {
include smallflow::test
filebucket {'main':
path => false, #设置agent节点不需要保存
# path => "/tmp/backup", #指定文件备份的本地路径
server => "puppet.master.com", #设置将文件更改之前的版本保存到远程server端
}
}
使用总结
使用file进行文件操作时,该类型本身自带判断功能,只有当所传输文件、所创建文件夹、所建立链接不存在时才会进行file中指定的操作。而通过exec实现同样功能时却需要单独使用判断语句进行上述判断。因此,file能够实现的功能,则不使用exec实现。
三、核心类型——EXEC
典型案例说明
1、exec类型中通过subscribe设置依赖来触发exec的执行,且refreshonly属性的值为true
如下示例:进行解压操作的exec使用subscribe依赖于checkmd5,且refreshonly值为true,这表明当checkmd5的exec执行成功后,才会触发解压操作的exec执行,如Subscribe触发使用结果图中黄色框中显示。
配置说明
class smallflow::test {
file { "/tmp/apache-tomcat-8.0.30.tar.gz":
ensure => "present",
owner => "root",
group => "root",
mode => "755",
source => "puppet:///modules/smallflow/apache-tomcat-8.0.30.tar.gz",
}
exec {
"tar -zxvf apache-tomcat-8.0.30.tar.gz":
user => "admin",
cwd => "/tmp",
path => "/usr/bin:/usr/sbin:/sbin:/bin",
provider => "shell",
timeout => "60",
subscribe => "File[/tmp/apache-tomcat-8.0.30.tar.gz]",
refreshonly => "true", #配合subscribe同时使用,参数值为true时,subscribe所依赖的File[/tmp/apache-tomcat-8.0.30.tar.gz]执行成功时,当前exec方可被触发执行。
}
}
Subscribe触发使用结果 trigger
subscribe与refreshonly组合说明
subscribe | refreshonly | action |
---|---|---|
true | true | subscribe所依赖类型执行成功时,当前exec方可执行 |
true | false | 不论subscribe所依赖类型是否执行,当前exec均执行 |
true | – | 不论subscribe所依赖类型是否执行,当前exec均执行 |
2、同时使用onlyif与unless
exec中对命令做出条件限制有两种方式:onlyif与unless。onlyif表明只有当测试返回值为0时,主命令才会被执行。若onlyif中存在一组测试命令,那么每一个测试返回值均为0时,主命令被执行。而unless与onlyif恰恰相反,当测试命令返回值非0时,执行主命令。若unless中存在一组测试命令,那么每一个测试返回值均非0,执行主命令。当对于exec进行条件限制,需要判定条件返回不同值,即要求一个返回0而另一个返回非0时,则可同时使用unless与onlyif,且两个判定条件无先后顺序,同时满足时方可执行主命令。
配置说明
class smallflow::fdisk {
exec {
"echo /dev/vdb /export ext4 nofails 0 0 >> /etc/fstab":
user => "root",
cwd => "/root",
path => "/usr/bin:/usr/sbin:/sbin:/bin",
provider => "shell",
timeout => "60",
unless => "cat /etc/fstab | grep vdb",
onlyif => "fdisk -l | grep ^/ | grep vdb",
}
}
四、核心类型——ssh_authorized_key
使用ssh_authorized_key类型,通过指定用户、路径以及秘钥内容,可在相应的authorized_keys文件中以追加的方式增加秘钥。并且,当相同的秘钥存在时,不会再重复追加。注:name一致时视为同一秘钥;若name不一致,key一致也被视为不同秘钥而重复添加。
配置说明
class smallflow::jump_keys {
ssh_authorized_key {
"root@10.10.0.10": #相同密钥,此name必须一致
ensure => "present",
type => "ssh-rsa",
key => "AAAAB3NzaC1yc2EAAAADAQABbbbBAQC/2uvPWzfwNisTBEAL11UIV0iiF3yIPw9Vw0CJzpdHqSm8V4yutN8Qmlwn/ituruJuUx0xxsPYk6Vn7GkngABC2xpuHdoSIrw/uFtbd6REC/uXO9fG17E8yj+OlLbIvZryo57oudMseOH+4Y4ssZ56prAsRyYCg4+JuEajZwEIVQVzy2B9CdRATOJYGVHoAONkll5xDy5xBhR43b/H3WnAbdlq9k+KN/8fOQ4S41AAGDnOtzFr3kpBz+BgHHmF/oWrnf6DyyZIoiljyq9zrm5QMObYMtpXW8IVdHxq6ZSyUbJ7XwA9XsOSfivoNN7p3s5y4VkPXBvaUL6AiNISX/v7",
target => "/root/.ssh/authorized_keys",
user => "root";
}
}
五、Puppet变量——facter
典型案例说明
1、通过facter变量直接获取机器的uptime时间
在onlyif和unless判断语句中,$符号被看做是一个变量,因此当我们将运行时间作为onlyif的判断语句时,onlyif => [ uptime | awk -F ‘ ‘ ‘{print $3}’ ],onlyif会将[uptime_days]来获取机器的运行时间,此时onlyif判断语句可以正常生效。
配置说明
class smallflow::tomcat {
exec {
"tar -zxvf apache-tomcat-8.0.30.tar.gz && ln -s ./apache-tomcat-8.0.30 tomcat":
user => "admin",
cwd => "/export/servers/",
path => "/usr/bin:/usr/sbin:/sbin:/bin",
provider => "shell",
timeout => "60",
creates => "/export/servers/tomcat",
onlyif => "[ `expr ${uptime_days}` -lt 5 ]", #通过facter变量uptime_days获取机器的运行时间,且以天为单位
}
}
2、site.pp文件中通过变量ipaddress获得机器节点IP,用来定义节点
通过$::ipaddress变量获得节点的IP地址后,通过正则表达式的匹配来给节点分组,不同的分组中可以根据需求include不同的模块。采用IP地址的方式定义节点可以避免节点命名不规范,从而导致的无法对节点分组的问题。
配置说明
node default {
case $::ipaddress {
/^10\.144\.120.\d/: {
include smallflow
include blackshark
}
}
case $::ipaddress {
/^10\.144\.128.\d/: {
include smallflow
}
}
}
3、变量operatingsystemmajrelease获得机器系统的主版本号
以CentOS系统为例,版本6与版本7中服务启动方式不同,因此为提高pp文件的兼容性,可通过变量获取到系统的主版本号,根据版本的不同执行相应的操作。
配置说明
class smallflow::ifrit {
if $operatingsystemmajrelease == '6' {
exec {
"service ifritd start":
user => "root",
cwd => "/tmp",
path => "/usr/bin:/usr/sbin:/sbin:/bin",
provider => "shell",
timeout => "60",
unless => "service ifritd status"
}
}
elsif $operatingsystemmajrelease == '7' {
exec {
"systemctl restart ifritd":
user => "root",
cwd => "/tmp",
path => "/usr/bin:/usr/sbin:/sbin:/bin",
provider => "shell",
timeout => "60",
unless => "systemctl status ifritd"
}
}
}
4、自定义facter变量
在自定义facter变量的路径下编写.rb文件,并将自定义facter变量的路径写入/etc/profile文件中
(原文缺图)
image2018-5-16 14:55:2.png
(原文缺图)
image2018-5-16 15:2:54.png
在需要运行自定义facter变量的模块中创建与files、manitests并列的/lib/facter文件夹,并将在自定义路径下创建的.rb文件复制到/lib/facter文件夹下。
(原文缺图)
image2018-5-16 14:43:51.png
在puppet master的配置文件puppet.conf文件中,开启“模块中的插件”功能,当agent执行puppet agent -t请求时,便会同时加载master中所创建的自定义facter变量。注:自定义facter变量在agent首次执行puppet agent -t请求时只会被加载到agent机器中,但并不能被.pp文件所使用,在二次执行时方可正常使用。
(原文缺图)
image2018-5-16 14:56:25.png
六、其它用法
1、类型重定义冲突避免
在不同的pp文件中,由于策略需求定义了相同的类型且title相同时,执行puppet请求时会报错如下:
解决方法:
class iaas::inotify {
if ! defined(File["/usr/lib/systemd"]) { #增加此行避免重定义报错
file {"/usr/lib/systemd":
ensure => "directory",
owner => "root",
group => "root",
mode => "0755";
}
}
}
若有多个pp文件中都定义了相同title的类型,则只有一个不需要增加if ! defined避免重定义报错,其余多个都需要添加。
Puppet使用特性总结
- 同一个pp文件中存在多个类型操作时,无需对多个操作进行排序,puppet在执行时可自行判断各个操作的先后顺序来执行操作。
- 不同类型中的属性不可在其它类型中使用。
Puppet使用最佳实践
- 尽可能使用puppet自身的type来实现各类功能,从而更好的利用Puppet跨平台跨版本的特性,如果全部用exec命令实现,则无法适配各类操作系统,各类版本
来源:CSDN
作者:智能运维
链接:https://blog.csdn.net/zhinengyunwei/article/details/104048767