Puppet 仅当不在exec资源中工作时

Puppet 仅当不在exec资源中工作时,puppet,Puppet,即使grep命令返回1,也会执行exec资源。我哪里做错了 exec { 'add text to file': cwd => '/usrdata/apps/java', command => 'command which writes a line in file', onlyif => "grep -c -w line-in-file /path/to/file" } 如果文本已经存在于文件中,则不会添加文本。puppet Descri

即使grep命令返回1,也会执行
exec
资源。我哪里做错了

exec { 'add text to file':
  cwd     => '/usrdata/apps/java',
  command => 'command which writes a line in file',       
  onlyif  => "grep -c -w line-in-file /path/to/file"
}

如果文本已经存在于文件中,则不会添加文本。

puppet Descripte exec是这种情况下最好的朋友。您知道,
onlyif
命令返回退出状态1,因为您在启用了
--debug
输出的情况下运行puppet?您知道,出于同样的原因,
Exec
的命令在同一目录运行期间运行吗?木偶输出的相应部分将与情况相关。否则,您可能会错误地将任何您确实看到的效果解释为
onlyif
属性,如果该属性没有广告效果。您缺少我的要点:(1)您需要确定当Puppet运行grep时,它的退出状态实际上是什么。直接运行它时的退出状态与期望它返回的退出状态无关。(2) 从您的描述中不清楚Exec的命令是否实际运行(例如,与正在评估但其命令未运行的Exec资源相比)。(3) Puppet调试输出中的详细信息可能会为我们澄清问题,尽管还有其他问题。请确保您没有其他Puppet资源或外部进程直接或间接地管理同一文件。例如,如果通过某个地方的
文件
资源管理整个文件,那么这是管理其内容的唯一机制。您也不应该使用
文件行
Exec
或其他方法来单独管理此类文件状态的各个方面。启用调试输出的一种方法是将
--debug
选项添加到
puppet agent
命令中。这就是我在早些时候的评论中这样写的原因。
exec { 'add text to file':
  cwd     => '/usrdata/apps/java',
  command => "grep -q -F -v 'text to check if present or not' /usrdata/apps/java || echo 'text to add' >> location_of_file.txt",
}