我遇到了一个非常奇怪的行为与Puppet的Exec类型。
我在一个类中有两个类似的Exec[]
,都带有onlyif
参数,如下所示。问题是Exec['apt-update']
总是被执行(即每次Puppet的代理应用它的清单),即使onlyif
条件是假的,不像Exec['install-newrelic-apt-key']
工作良好。
注意:我的Exec[]
的路径($ path)是在这个类之外配置的,所有命令在命令行
class newrelic::server($license_key) {
file { "/etc/apt/sources.list.d/newrelic.list":
ensure => present,
content => "deb http://apt.newrelic.com/debian/ newrelic non-free",
}
exec { "apt-update":
command => "aptitude update",
onlyif => "test 0 -eq $(dpkg -l | grep -c newrelic-sysmond)",
require => File['/etc/apt/sources.list.d/newrelic.list'],
}
exec { "install-newrelic-apt-key":
command => "apt-key adv --keyserver hkp://subkeys.pgp.net --recv-keys 548C16BF",
onlyif => "test 0 -eq $(apt-key list | grep -c 548C16BF)",
}
package { "newrelic-sysmond":
ensure => latest,
require => [
Exec["install-newrelic-apt-key"],
Exec["apt-update"],
],
}
file { "/etc/newrelic/nrsysmond.cfg":
ensure => present,
content => template("newrelic/nrsysmond.erb"),
owner => "root",
group => "newrelic",
mode => "0640",
notify => Service["newrelic-sysmond"],
}
service { "newrelic-sysmond":
ensure => running,
enable => true,
hasstatus => true,
require => Package["newrelic-sysmond"],
}
}
*以上代码属于公有领域,请随意使用
我不相信你的onlyif
命令会经历你所期望的shell插值。我会尝试切换到unless
语句如下:
class newrelic::server($license_key) {
file { "/etc/apt/sources.list.d/newrelic.list":
ensure => present,
content => "deb http://apt.newrelic.com/debian/ newrelic non-free",
}
exec { "apt-update":
command => "aptitude update",
unless => "dpkg -l | grep -c newrelic-sysmond",
require => File['/etc/apt/sources.list.d/newrelic.list'],
}
exec { "install-newrelic-apt-key":
command => "apt-key adv --keyserver hkp://subkeys.pgp.net --recv-keys 548C16BF",
unless => "apt-key list | grep -c 548C16BF",
}
package { "newrelic-sysmond":
ensure => latest,
require => [
Exec["install-newrelic-apt-key"],
Exec["apt-update"],
],
}
file { "/etc/newrelic/nrsysmond.cfg":
ensure => present,
content => template("newrelic/nrsysmond.erb"),
owner => "root",
group => "newrelic",
mode => "0640",
notify => Service["newrelic-sysmond"],
}
实际上清单的一切都是正确的,但是在我重新启动puppet代理进程之后,它只是按预期开始工作。
听起来像是Puppet的bug