本文系统centos6.0 puppet:2.6.18

exec参数介绍

command : 指定要执行的命令。如果忽略,这个参数的值默认为资源的标题。必须填写命令的完整路径或者提供这个命令的查找路径。假如命令执行成功,执行过程的输出将会记录到普通 (normal)日志中,但是如果命令执行失败,任何的输出都会记录到错误日志中。
creates : 命令创建的一个文件。加入这个参数设置的话,只有这个文件不存在的时候命令才会执行,比如下面的例子;

exec {"/var/lib/puppet/report": path => ["/bin","/usr/bin"], cwd => "/var/lib/puppet", command => "mkdir -p /var/lib/puppet/report", creates => "/var/lib/puppet/report", group => 'zhangsan', }

上例中,只有/var/lib/puppet/report文件不存在的时候,command 中的命令才会执行,也就是生成report文件,某种意义上creates表明的结果

cwd : 命令执行的路径。假如目录不存在,命令执行将会失败。
environment : 为命令设置附加的环境变量。加入你用这个参数设置PATH,那么将会把path参数的值覆盖。多个环境变量需要使用数组指定。
user : 定义运行命令的用户。 注意如果你使用了这个参数,那么任何的错误输出不会在当下被捕捉,这是Ruby的一个bug。
group : 执行命令运行的用户组。这个看起来在各个平台运行结果不确定,这是平台的问题不是ruby或者puppet的问题。
logoutput : 是否记录输出信息。默认会根据exec资源的日志等级来记录输出信息,使用on_failure只有当命令执行出错的时候才会记录输出信息。值可以为true、fales、on_failure和任何合法的日志等级。
onlyif : 只有onlyif指定命令执行返回为0的时候,命令才会执行

exec {"/var/lib/puppet/report":  path => ["/bin","/usr/bin"],  cwd => "/var/lib/puppet",  command => "mkdir -p /var/lib/puppet/report",  group => 'zhangsan',  onlyif => "test -f /var/lib/puppet/test.file",  logoutput => true  }

上面表明当test.file存在的时候才执行command命令
path : 命令执行搜索的路径。如果没有指定path,命令需要填写完整的路径。路径可以指定为一个数组并通过冒号分隔。
如:

path => ["/bin","/usr/bin"],

refresh : 定义如何更新命令。当exec收到一个来自其他资源的事件时,默认只会重新执行一次命令。不过这个参数允许你定义更新时执行不同的命令。

refreshonly : 该属性可以使命令变成仅刷新触发的,也就是说只有在一个依赖的对象被改变时,命令才会被执行。仅当命令与其他对象有依赖关系时,这个参数才有意义。当你要触发某个行为时,会显得很有用:
要注意的是只有subscribe和notify可以促发行为,而不是require,所以在使用refreshonly时,只有同时使用subscribe或notify才有意义。有效的值为true, false。
returns : 指定返回的代码。如果被执行的命令返回了其他的代码,一个错误(error)会被返回。默认值是0,可以定义为一个由可以接受的返回代码组成的数组或单值
timeout : 命令运行的最长时间。如果命令运行的时间超过了timeout定义的时间,那么这个命令就会被终止,并作为运行失败处理。当定义为负值时就会取消运行时间的限制。timeout的值是以秒为单位的。
unless : 如果这个变量被指定了,那么exec会先执行,除非unless所设定的命令返回0。例如:

exec { "/bin/echo root >> /usr/lib/cron/cron.allow":  path => "/usr/bin:/usr/sbin:/bin",  unless => "grep root /usr/lib/cron/cron.allow 2>/dev/null"      }

上面这段代码先用grep在cron.allow文件(Solaris系统中)中找root,如果没有找到,就写入root。

要注意的是这个参数里的命令跟主命令遵循同样的规则,也就是说如果path没有被设置的话,需要使用绝对路径。
案例1、让/var/www/html/index.html文件修改时就自重启httpd服务

[root@master ~]# vim /etc/puppet/manifests/exec2.ppfile { "/var/www/html/index.html":    content => template("/etc/puppet/manifests/index.html"),    }exec { "httpdserver":    path => ["/sbin"],    command => "service httpd restart",    subscribe => File["/var/www/html/index.html"],    refreshonly => true,    logoutput => "on_failure",    }