考虑一下,我有一个安装软件包的配置文件。安装后,它将运行一些exec
命令。但是,在首次安装软件包时,这些命令仅需要运行一次。
package { 'package1':
ensure => 'present'
}
exec { 'signal_package_conf':
command => 'systemctl restart package.service',
path => '/sbin:/bin:/usr/sbin:/usr/bin',
refreshonly => true,
subscribe => Package['package1'],
}
但是,假设此特定软件包已安装为另一个配置文件中另一个软件包的依赖项。
当puppet进入package1
资源时,它将发现该软件包已经安装并且不会再次安装。由于puppet不会知道此隐式包的依赖性,因此对包的订阅是否仍然有效,并在exec
资源中执行命令?
答案 0 :(得分:2)
此答案分为两部分,以解决一般情况下有关刷新关系的两种可能的查询解释。
刷新其他类的事件和顺序
让我尝试以更笼统的方式重写我所理解的问题。您在问:
问题
假设Exec资源Y用refreshonly => true
预订到类A中的资源X。然后假定资源Z 需要在类B中相同的资源X
换句话说,想象一下这段代码:
class b () {
notify { 'Z':
require => Notify['X'],
}
}
class a () {
notify { 'X': }
exec { 'Y':
command => '/bin/echo Y',
refreshonly => true,
subscribe => Notify['X'],
}
}
include a
include b
最终排序是否有可能是X,Z,Y,如果这样,那么 refresh 事件肯定会到达Exec资源Y,考虑到X和Y可以用Z分隔。时间?
答案
是的,是的。回想一下,Puppet构建有向无环图,并且它从遍历该图计算出最终顺序。此代码会导致时间X,Y,Z和X,Z,Y两种可能的排序(使用puppet apply /tmp/code.pp --ordering=random
尝试几次)。
但是没关系,因为Puppet还会跟踪收到刷新事件的资源队列。
如果Puppet外部的软件包管理器将软件包A安装为软件包B的依赖项,该怎么办
您还可能会询问Rup或Puppet外部存在的其他程序包管理器级别的依赖项。如果是这样,自然而然,Puppet不会知道这些。
如果是这样,是的,如果程序包管理器(或Puppet之外的任何其他程序)满足订阅要求,则不会发送刷新事件。