我应用本地清单来测试exec
和file
资源:
class test_file {
exec { "touch /tmp/testfile":
path => ["/bin", "/usr/bin", "/sbin", "/usr/sbin"],
unless => "test -d /tmp 2>/dev/null",
}
file { "/tmp/success":
mode => "0777",
owner => "root",
group => "staff",
source => "file:///Users/Shared/success",
require => Exec["touch /tmp/testfile"],
}
}
我期待发生的事情:
exec
运行并退出,因为unless
语句返回0,因此文件资源永远不会运行,并且/tmp
中都没有创建文件。
实际发生的事情:
file
资源始终运行,并复制"成功"归档到/tmp
我已经在macOS 10.11和10.12上使用puppet agent 4.10和5.3.2运行了这个结果。我只是试图运行一个条件,表示如果某个命令退出成功,则不会复制文件。任何见解或方向将不胜感激。
答案 0 :(得分:1)
你误解了Puppet是如何运作的。
require元参数声明应该应用资源的顺序。*鉴于您的清单,Puppet只承诺Exec资源 - 如果它应用于所有 - 将永远是在文件资源之前应用。
还有另一个元参数subscribe。如果资源订阅到另一个资源,那么Puppet会尝试刷新"该资源,如果它订阅的资源改变状态。
不幸的是,你不能在这里使用它,因为文件资源会忽略"刷新事件"。
你可以做的,虽然它有点难看,但是:
class test_file () {
Exec {
path => ["/bin", "/usr/bin", "/sbin", "/usr/sbin"],
}
exec { "touch /tmp/testfile":
unless => "test -d /tmp 2>/dev/null",
}
exec { "cp /Users/Shared/success /tmp/success":
subscribe => Exec["touch /tmp/testfile"],
refreshonly => true,
}
}
*如果第一个资源无法应用,则require元参数也会阻止第二个资源被应用。请参阅文档中的failed dependencies部分。