如果缺少特定文件,我需要使用Puppet重新安装包。我怎么能得到这个?永远版本的Puppet是onlyif
参数可用,但我们仍然使用Puppet 3.1。
答案 0 :(得分:3)
不要将Puppet误认为是某种巴洛克式的脚本引擎。重新安装包是操作,而Puppet类,资源和DSL通常专注于描述状态。 Puppet的一般范例是你告诉它你想要什么样的状态,并且它自己计算出实现该状态所采取的行动(如果有的话)。甚至Exec
资源最好被概念化并用作要管理的状态的表示。
Puppet Package
资源无法识别"已安装但已损坏"或任何类似的东西,因此他们无需重新安装(而非更新)包,也没有任何机制。
如果您关心的只是一个您期望软件包提供的特定文件,那么您应该考虑将该文件置于直接管理下(通过File
资源),而不是依赖于软件包重新安装来恢复它如果它应该失踪。
但是,您应该考虑系统的配置或安全策略中的哪些缺陷会提供随机系统文件意外丢失的任何合理可能性。如果您使用相关文件作为金丝雀来检测更广泛的损害,您应该特别这样做。
尽管如此,如果你坚持做你要求的事情,那么Exec
资源可以提供帮助。您需要的细节尚不清楚,但您可以将其作为一种模式:
exec { 'Ensure package mypackage good':
command => '/usr/bin/yum -y reinstall mypackage',
creates => '/path/to/some_file',
require => Package['mypackage']
}
Exec
类型还有unless
和onlyif
个参数(包括在Puppet 3.1中),但creates
参数用于使用是否存在的特定情况一个文件,用于确定是否需要运行该命令,这正是您想要的。
还请注意require
参数。这假设包裹' mypackage'是在Puppet管理下(未显示),并保证在包之前不会同步Exec
。这样,如果包完全不存在,你可以确定Puppet会在测试预期提供的任何文件的存在之前安装它(假设你已经指定了它)。