为什么puppet中的exec资源的前一个_值始终为notrun?

为什么puppet中的exec资源的前一个_值始终为notrun?,puppet,Puppet,我有两个Puppetexec资源,其中一个有一个onlyif节。在报告和傀儡板中,它们总是显示为已更改,因为它们的上一个_值总是不运行。这没有任何意义,尤其是对于没有onlyif(每次都会运行)的情况 这是虫子吗?我能做些什么来解决这个问题 编辑:按照Ina的建议添加代码 exec { 'make-plugins-executable': command => "/usr/bin/chmod a+x ${pluginsdir}/check*", require => File

我有两个Puppet
exec
资源,其中一个有一个
onlyif
节。在报告和傀儡板中,它们总是显示为已更改,因为它们的
上一个_值
总是
不运行
。这没有任何意义,尤其是对于没有
onlyif
(每次都会运行)的情况

这是虫子吗?我能做些什么来解决这个问题

编辑:按照Ina的建议添加代码

exec { 'make-plugins-executable':
  command => "/usr/bin/chmod a+x ${pluginsdir}/check*",
  require => File['plugins']
}

exec { 'nagios-permissions':
  command => "/usr/bin/chown -R nagios:nagios ${confdir}",
  onlyif  => "/usr/bin/test ! -z \"/usr/bin/find ${confdir} ! -user nagios -o ! -group nagios\""
}
此外,这是日志中的输出:

2018-07-23 11:40:48 +0100 /Stage[main]/Bcc_nagios/Exec[make-plugins-executable]/returns (notice): executed successfully
2018-07-23 11:40:48 +0100 /Stage[main]/Bcc_nagios::Master/Exec[nagios-permissions]/returns (notice): executed successfully
2018-07-23 11:40:58 +0100 Puppet (notice): Applied catalog in 10.09 seconds

它们被运行,但在上次运行摘要中显示为
notrun
。yaml

您写道,以下
Exec
总是报告为已更改,这对您来说没有任何意义,显然是因为您希望
onlyif
可以防止这种情况发生:

但这是有道理的。您在
onlyif
中发出的命令与您似乎认为的不一样。以下是在没有木偶级别引用和转义的情况下它的显示方式:

/usr/bin/test ! -z "/usr/bin/find /some/directory ! -user nagios -o ! -group nagios"
该命令将始终返回0(true):它只是测试给定字符串是否为非空。没有运行
find
命令;这个测试只是通过了对论点的检验。因此,主
命令
中的
chown
始终处于运行状态,并报告该状态

您似乎更想要这样的东西:

exec { 'nagios-permissions':
  command => "/usr/bin/chown -R nagios:nagios ${confdir}",
  onlyif  => "/bin/sh -c \"'!' -z `/usr/bin/find /some/directory '!' -user nagios -o '!' -group nagios`\""
}
注意三种不同类型的引号(如果包含转义,则有四种)。还要注意,您需要确保调用shell来运行命令,如图所示,因为它依赖于命令替换


然而,正如在对该问题的评论中所建议的那样,使用递归的
文件
资源进行此类工作可能比通过
Exec
处理它要好。我希望只有当一个或多个文件的属性发生更改时,才会报告更改。

您能在此处发布exec代码吗?如果我们有一个具体的例子可以看的话,这会很有帮助。@InaTsetsova谢谢你的回答。我还添加了日志输出,以显示它们正在运行type@balder谢谢你的建议。我不知道我可以像那样使用
文件
资源。我试试看。
exec { 'nagios-permissions':
  command => "/usr/bin/chown -R nagios:nagios ${confdir}",
  onlyif  => "/bin/sh -c \"'!' -z `/usr/bin/find /some/directory '!' -user nagios -o '!' -group nagios`\""
}