#vi /etc/puppet/fileserver.conf puppetmasterd自带一个简易的文件服务器,配置方法是编辑/etc/puppet/fileserver.conf,增加一个配置片段myfiles ------------------------------------ [myfiles] path /opt/ // 设置待推送的文件/文件夹相对模块根目录,结合后面的体会含义 allow 192.168.1.0/24 // 设置准许连接到服务端的主机地址
#vi /etc/puppet/manifests/site.pp ------------------------------------- file { "/bbb/redis-2.4.tar.gz": //客户端将要生成的拷贝文件名称 source => "puppet://server.puppet/myfiles/redis-2.4.tar.gz" /* source字段为服务器端一个被传送文件/文件夹, puppet.server为puppet服务器名称,即hostname,生产环境下用内部的DNS上作解析, myfiles为上步中/etc/puppet/fileserver.conf文件中配置的module名称,每个module都有单独的path和allow等属性,这里的myfiles映射到path为/opt/的文件系统实际路径, redis-2.4.tar.gz为服务器端文件系统中一个相对于module中path的文件实际路径。 综上:这段配置实际含义是把服务端/opt/redis-2.4.tar.gz文件传到客户端/bbb/redis-2.4.tar.gz。 */ }
#puppetd --test --server server.puppet
如果要分发文件夹,作如下配置
#vi /etc/puppet/manifests/site.pp ------------------------------------- file { "/bbb/redisdir": //客户端将要生成的拷贝文件目录名称 source => "puppet://server.puppet/myfiles/redisdir", recurse=>true, //递归拷贝 ensure=>directory, //确保客户端/bbb/redisdir目录存在 force=>true //强制删除或覆盖已存在目录 }
#vi /etc/puppet/manifests/site.pp ------------------------------------------------------ file { "/tmp/dd142/puppet-2.6.13.tar.gz": owner => "puppet", group => "puppet", mode => 666, }
#puppetd --test --server server.puppet
vi /etc/puppet/manifests/site.pp --------------------------------------------- exec { "exec-mkdir": cwd => "/opt", //切换到命令行运行时目录 command => "sh /opt/lgh.sh", user => "root", path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin", }
vi /opt/lgh.sh --------------------------------------------- #!/bin/bash mkdir /opt/shelldir
# puppetd --test --server server.puppet
在/opt目录下查看shelldir目录有没有建立。
简单说来exec资源就是在执行puppet的时 候,调用shell执行一条shell语句。通过exec可执行程序,还可以设置执行时的path,环境变量,user/group,是否记录output等,很方便,例如:
exec { “/root/puppet/nagiosclient/nrpe.sh”:
cwd => “/root/puppet”,
timeout => 7200,
logoutput => on_failure,
user => root,
path => ["/sbin", "/usr/sbin", "/usr/local/sbin", "/root/bin", "/usr/local/bin", "/usr/bin", "/bin", "/usr/lib64/jvm/jre/bin"],
require => File["/root/puppet/nagiosclient/nrpe.sh"]
}
想在各客户机上执行时,我一般就是先用上述file资源的配置把该脚本推送到客户机上,然后用空上exec资源去执行它,注意exec中要配置好require 该file,否则无法保证exec在file之类在客户上执行。
有人说,“exec资源在不到万不得已的时候不要去用,如果能用脚本实现,尽量写成脚本通过file资源分发到服务器上面。然后用其他的方式来调用脚本。例如crontab。虽然puppet提供了crontab资源,但是你完全可以用file资源来把 crontab任务放到 /etc/ cron.d目录下来实现crontab资源的管理。使用puppet的时候,尽量用最简单的语法,越是花哨的语法也越容易出错。”
vi /etc/puppet/manifests/site.pp --------------------------------------------- cron { "cron-shell": #title部分,可用来作为注释。 command => "sh /opt/lgh.sh" #要执行的命令 user => "root", #添加到root用户下的crontab中 minute => "30", #即第一个星号 hour => "17" #即第二个星号 }
[root@client ~]# puppetd --test --server server.puppet
然后在客户端使用#crontab -l查看效果
[root@client ~]# crontab -l # HEADER: This file was autogenerated at Mon Nov 04 16:56:25 +0800 2013 by puppet. # HEADER: While it can still be managed manually, it is definitely not recommended. # HEADER: Note particularly that the comments starting with 'Puppet Name' should # HEADER: not be deleted, as doing so could cause duplicate cron jobs. # Puppet Name: cron-shell 30 17 * * * sh /opt/lgh.sh
#vi /etc/puppet/manifests/site.pp ---------------------------------------------- service { iptables: ensure => "running", }
#puppetd --test --server server.puppet
http://blog.loudly.me/tag/puppet/