根据我的示例中的文档,资源' service x'将在目标资源require =>时执行Exec [' checkForFile']已成功应用。 exec命令只会在文件' /etc/init.d/x'在场。
所以当文件' /etc/init.d/x'如果不存在,则不应执行Exec [' checkForFile']中的命令 资源'服务x'如果没有执行目标资源,应该跳过。
对我来说,资源服务x没有运行是正确的,但同时我没有收到任何错误或退出代码1以显示Exec [' checkForFile']无法运行。这是预期的行为吗?
class test2::testcleanup (
$target_location,
)
{
service { 'x':
ensure => stopped,
restart => "service x restart",
stop => "service x stop",
status => "service x status",
require => Exec['checkForFile'],
before => [
File["/etc/init.d/x"],
File[ "remove_directory"],
],
}
exec { "checkForFile":
command => "/bin/true",
path => ["/usr/bin","/usr/sbin", "/bin"],
onlyif => 'test -f /etc/init.d/x',
logoutput => true,
}
file {'/etc/init.d/x':
ensure => absent,
}
file {'remove_directory':
ensure => absent,
path => $target_location,
recurse => true,
purge => true,
force => true,
}
}
答案 0 :(得分:4)
根据我的示例中的文档,资源'service x' 将在目标资源require =>时执行Exec ['checkForFile']是 成功应用。 exec命令只会执行 文件'/etc/init.d/x'存在。
是的,如果未成功应用Service['x']
,则不会应用Exec['checkForFile']
。
所以当文件'/etc/init.d/x'不存在时,命令就在 不应执行Exec ['checkForFile']
是的,但这与Exec
未应用有所不同。
与任何其他资源一样,Exec
的模型目标机器状态,尽管在它们的情况下,该状态是一个目录运行的上下文的本地。通常它被描述为Exec
的命令是否已经运行,但反过来更好地表征,因为Exec
的命令是否需要运行< / em>与否。如果它处于“需要运行”状态,则成功执行Exec
命令会将其转换为“不需要运行”状态。
unless
的{{1}},onlyif
和creates
属性用于确定相应物理(可以说)资源的初始状态。如果没有提供它们,则物理资源最初处于“需要运行”状态。如果提供了它们中的一个或多个,则它们可以指示Exec
最初处于“不需要运行”状态。 这就是目标状态。在这种情况下,Exec
成功应用而不运行其命令。
和资源'服务 如果未执行目标资源,则应跳过x'。
没有。如果应用Exec
失败,将跳过Service['x']
。只有在其命令运行并以失败状态退出时才会发生这种情况。
例如,不要在Exec
中使用onlyif
,而是使用Exec
作为'test ! -f /etc/init.d/x'
。
对我来说,资源服务x没有运行,这是正确的,但在 同时我没有收到任何错误或退出代码1显示 Exec ['checkForFile']无法运行。这是预期的行为吗?
可能。
在您的情况下,始终成功应用command
。如果Exec
存在,则/etc/init.d/x
运行(成功)。如果该文件不存在,则/bin/true
成功而不运行Exec
。 /bin/true
将以任一方式应用,但如果物理服务已处于其目标状态(已停止),则Puppet将不会采取任何进一步操作,并且该资源的任何内容都不会出现在默认日志的输出中水平。启用Service['x']
登录代理应该更清楚地发生了什么。
但所有这些都是落后的。 Puppet不是一个脚本引擎,它不能很好地工作。确定机器的适当目标状态所需的任何瞬态机器信息最好以事实的形式传达给Puppet。然后,您在目录构建期间根据这些事实和任何其他可用数据确定要声明的资源。
此外,最好最小化确定其目标状态的当前机器状态量。更愿意将目标状态与机器的身份联系起来,并在必要时根据不变特征(操作系统,硬件架构等)调整细节。虽然这种模式可能不足以满足所有需求,但它通常就足够了,而且它可以作为一个很好的基线。