我正在尝试使用Puppet来修改文件内容,但如果文件不存在,我将跳过并且什么也不做。但是,我发现依赖性检查只在第一次迭代中起作用,但在那之后,它似乎不起作用。这是我的傀儡清单:
class tibco::hawk_gc_tuning {
$domain_array = split($domain_list, '\n')
$hawkgc = hiera('hawk_gc_arg','xxxxxx')
$domain_array.each |$tibcodomain| {
notify { "Now in : ${tibcodomain} ": }
exec {"check_presence_${tibcodomain}":
path => "/usr/bin:/usr/sbin:/bin",
command => 'true',
onlyif => "test -e /home/tibco/tra/domain/${tibcodomain}/hawkagent_${tibcodomain}.tra"
}
file_line { "change $tibcodomain hawk agent gc arg comment":
require => Exec["check_presence_${tibcodomain}"],
path => "/home/tibco/tra/domain/${tibcodomain}/hawkagent_${tibcodomain}.tra",
line => '# tuning for hawkagent',
match => '^# tuning for hawkagent',
}->
file_line { "change $tibcodomain hawk agent gc arg":
path => "/home/tibco/tra/domain/${tibcodomain}/hawkagent_${tibcodomain}.tra",
line => "${hawkgc}",
match => '^java.extended.properties=-XX\\\\:MaxPermSize\\\\=.*',
}
}
}
以下是我的代码输出:
注意:现在:A 注意:/ Stage [main] / Tibco :: Hawk_gc_tuning / Notify [Now in:A] / message:defined' message' as'现在:A' 注意:/ Stage [main] / Tibco :: Hawk_gc_tuning / Exec [check_presence_A] / return:已成功执行 注意:现在在:B 注意:/ Stage [main] / Tibco :: Hawk_gc_tuning / Notify [Now in:B] / message:defined' message' as'现在:B' 错误:/ Stage [main] / Tibco :: Hawk_gc_tuning / File_line [更改B hawk agent gc arg comment]:无法评估:没有这样的文件或目录 - /home/tibco/tra/domain/B/hawkagent_B.tra 注意:/ Stage [main] / Tibco :: Hawk_gc_tuning / File_line [更改B鹰代理gc arg]:依赖File_line [更改B鹰代理gc arg评论]有失败:true 警告:/ Stage [main] / Tibco :: Hawk_gc_tuning / File_line [更改B hawk agent gc arg]:由于依赖关系失败而跳过 注意:现在在:C 注意:/ Stage [main] / Tibco :: Hawk_gc_tuning / Notify [Now in:C] / message:defined' message' as'现在:C' 错误:/ Stage [main] / Tibco :: Hawk_gc_tuning / File_line [更改C hawk agent gc arg comment]:无法评估:没有这样的文件或目录 - /home/tibco/tra/domain/C/hawkagent_C.tra 注意:/ Stage [main] / Tibco :: Hawk_gc_tuning / File_line [更改C鹰派代理gc arg]:依赖File_line [更改C鹰代理gc arg评论]有失败:true 警告:/ Stage [main] / Tibco :: Hawk_gc_tuning / File_line [更改C hawk agent gc arg]:由于依赖关系失败而跳过 注意:完成的目录在1.06秒内运行
如上所示,A,B,C都不存在,但只有第一个A给出正确的结果并跳过file_line资源。有人可以给我一些关于这个问题的提示吗?
答案 0 :(得分:1)
您的设计基于一种常见的误解。
Puppet不是脚本语言。不要试图通过滥用exec
资源类型来对目录中的查询建模。 Puppet清单需要根据编译期间出现的信息建模一个相干目标状态。如果目标状态取决于代理系统上是否存在某个文件,则需要使用custom fact将此信息传递给主服务器。
特别是,您的exec
测试无法帮助您。当文件存在时,Puppet会尝试通过调用true
命令来同步它,是的。这将成功。但是,如果文件不存在,Puppet假定exec
根本不需要同步。在这种情况下,依赖资源就可以开始了。