puppet来管理文件和软件包
1 exec的使用,可以运行shell命令
为配置文件添加配置,指示写了关键部分,其他配置省略没写
代码示例如下:
[root@pup manifests]# cat wenjian.pp class motd::wenjian{ define append_if_no_such_line($file, $line) { exec { "/bin/echo '$line' >> '$file'": unless => "/bin/grep -q '$line' '$file'", #看文件是否存在,不存在在追加 } } append_if_no_such_line { "enable-ip-conntrack": file => "/etc/modules", line => "ip_conntrack", } }
客户端过程如下
1 Notice: /Stage[main]/Motd::Wenjian/Motd::Wenjian::Append_if_no_such_line[enable-ip-conntrack]/Exec[/bin/echo 'ip_conntrack' >> '/etc/modules']/returns: executed successfully 2 Notice: Finished catalog run in 1.37 seconds
2时时保持文件内容的更新
使用 exec 资源将若干配置片段串接成一个文件,示例如下,稍微复杂点
1 首先创建/etc/puppet/modules/admin/manifests/rsyncdconf.pp文件 2 class admin::rsyncdconf { 3 file { "/etc/rrp": 4 ensure => directory, 5 } 6 7 exec { "update-rsyncd.conf": 8 command => "/bin/cat /etc/rrp/*.conf > /etc/rsyxin.conf", 9 refreshonly => true, 10 } 11 }
然后别忘记在init.pp文件包含这个类,接着
1 创建如下/etc/puppet/modules/myapp/manifests/rsyncpp.pp 2 class myapp::rsyncpp { 3 include admin::rsyncdconf #包含上边刚创建的类 4 5 file { "/etc/rrp/myapp.conf": 6 ensure => present, 7 source => "puppet:///modules/myapp/myapp.rsync", 8 require => File["/etc/rrp"], 9 notify => Exec["update-rsyncd.conf"], 文件一旦改变,就会执行 10 } 11 } 12 include myapp::rsyncpp
接着在file里面创建文件
创建 /etc/puppet/modules/myapp/files/myapp.rsync 文件: [myapp] uid = myappuser gid = myappuser path = /opt/myapp/shared/data comment = Data for myapp list = no read only = no auth users = myappuser
在客户端测试
1 Notice: /Stage[main]/Admin::Rsyncdconf/File[/etc/rrp]/ensure: created 2 Notice: /Stage[main]/Myapp::Rsyncpp/File[/etc/rrp/myapp.conf]/ensure: defined content as '{md5}d85e5aa28aca2faf3e32b98e96b405e4' 3 Info: /Stage[main]/Myapp::Rsyncpp/File[/etc/rrp/myapp.conf]: Scheduling refresh of Exec[update-rsyncd.conf] 4 Notice: /Stage[main]/Admin::Rsyncdconf/Exec[update-rsyncd.conf]: Triggered 'refresh' from 1 events 5 Notice: Finished catalog run in 2.04 seconds
说明下
(notify => Exec["update-rsyncd.conf"]只要 /etc/rrp 目录中有一个配置片段被更新,exec 资源就会执行一次
上面的说法也可以应用到 Apache 的 conf.d 目录或 PHP 的 php-ini.d 目录
2源码包编译安装的构建(常用)
使用puppet完成以下步骤
-
下载源码包
-
解压源码包
-
配置(Configure)并构建(build)程序
-
安装已构建的程序
如下实例:
[root@pup manifests]# cat install_app.pp class myapp::install_app{ exec { "Discuz_X3.2_SC_GBK.zip": cwd => "/usr/local/src", command => "/usr/bin/wget http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_GBK.zip"&& /bin/unzip Discuz_X3.2_SC_GBK.zip && cd Discuz_X3.2_SC_GBK.zip && && ./Configure --prefix=/usr/local &&make && make install, creates =>"/usr/local/Discuz_X3.2_SC_GBK", logoutput => on_failure, timeout => 0, } }
说明如下:
exec 命令被 && 运算符分割成了五个阶段。也就是说每个阶段的命令若执行失败, 整个命令将会失败且停止运行。 当你想确保每个子命令都成功运行之后才运行下一个子命令时,这是一种有用的构造方法。
creates =>"/usr/local/Discuz_X3.2_SC_GBK",
由于这是一个漫长的过程,你不想每次运行 Puppet 时都运行它,我们指定了一个条件, 即被创建的文件是否存在,存在的话么就不在执行,无论出于任何原因,如果需要重建,你可以删除此文件。
logoutput => on_failure
错误并非只发生在首次编译的情况。在出现问题时,我们指定了 logoutput 参数, 它将为我们显示编译或构建过程中的出错信息
最后,因为编译过程可能会持续一段时间,所以将 timeout 参数设置成了 0 (默认情况下,Puppet 执行 exec 命令 5 分钟后就会超时)
最后一点
如果你有一批必须从源代码构建的软件,那么将上述的 exec 放入一个 define 函数会使这一构建过程变得更方便,因为你可以使用大致相同的代码构建每个包。