Chinaunix首页 | 论坛 | 博客
  • 博客访问: 266086
  • 博文数量: 53
  • 博客积分: 2580
  • 博客等级: 少校
  • 技术积分: 509
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-29 10:02
文章分类

全部博文(53)

文章存档

2014年(1)

2013年(1)

2011年(14)

2010年(37)

我的朋友

分类: LINUX

2011-05-26 12:01:56

让puppet执行外部命令

多次反复用这个方式执行命令是有威胁性的,因此建议对执行的命令进行加锁或者类似的处理. 你也可以让exec只有在收到一个其他资源的事件的时候才执行. 因为exec资源是一种挥发性资源,命令执行完了,这个资源可以说就处理完了. 因此在不同的类里面,exec资源的名字可以是相同的,这是exec资源特殊的地方
1、当条件不满足时则执行某命令:

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没有被设置的话,需要使用绝对路径。

2、当条件满足时才执行某命令:

exec { “logrotate”:
path => “/usr/bin:/usr/sbin:/bin”,
onlyif => “test `du /var/log/messages | cut -f1` -gt 100000″
}
只有在test返回true的时候logrotate才会被运行。
需要注意的是onlyif定义的命令跟主命令遵循同样的规则,也就是说如果path没有被设置的话,需要使用绝对路径。

除此之外,onlyif还可以接受数组做为其值,例如:

onlyif => ["test -f /tmp/file1", "test -f /tmp/file2"]
上面的代码限定了只有在所有数组中的条件返回true时exec才会被执行。

3、当文件有修改时执行某命令:

### sysctl.conf
file { “/etc/sysctl.conf”:
source => “puppet://$puppetserver/files/etc/sysctl.conf”,
owner => “root”,
group => “root”,
mode => 0644,
}
# Rebuild the database, but only when the file changes
# 当sysctl.conf有更的时候才执行sysctl -p
exec { “sysctl refresh kernel config”:
path => ["/usr/bin", "/usr/sbin", "/bin", "/sbin"],
command => “sysctl -p”,
subscribe => File["/etc/sysctl.conf"],
refreshonly => true
}
当/etc/sysctl.conf有更新时,就执行:sysctl -p

4、其他
creates
指定命令所生成的文件。如果提供了这个参数,那么命令只会在所指定的文件不存在的情况的被执行:

exec { “tar xf /my/tar/file.tar”:
cwd => “/var/tmp”,
creates => “/var/tmp/myfile”,
path => ["/usr/bin", "/usr/sbin"]
}
cwd
指定命令执行的目录。如果目录不存在,则命令执行失败。
上面的代码限定了只有在所有数组中的条件返回true时exec才会被执行。

path

命令执行的搜索路径。如果path没有被定义,命令需要使用绝对路径。路径可以以数组或以冒号分隔的形式来定义。

refresh

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

refreshonly

该属性可以使命令变成仅刷新触发的,也就是说只有在一个依赖的对象被改变时,命令才会被执行。仅当命令与其他对象有依赖关系时,这个参数才有意义。当你要触发某个行为时,会显得很有用:

# Pull down the main aliases file
file { “/etc/aliases”:
source => “puppet://server/module/aliases”
}

# Rebuild the database, but only when the file changes
exec { newaliases:
path => ["/usr/bin", "/usr/sbin"],
subscribe => File["/etc/aliases"],
refreshonly => true
}
要注意的是只有subscribe和notify可以促发行为,而不是require,所以在使用refreshonly时,只有同时使用subscribe或notify才有意义。有效的值为true, false。

returns

指定返回的代码。如果被执行的命令返回了其他的代码,一个错误(error)会被返回。默认值是0,可以定义为一个由可以接受的返回代码组成的数组或单值。

timeout

命令运行的最长时间。如果命令运行的时间超过了timeout定义的时间,那么这个命令就会被终止,并作为运行失败处理。当定义为负值时就会取消运行时间的限制。timeout的值是以秒为单位的。

更多参考:

阅读(3638) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~