在 puppet 中订阅包

Subscribe to packages in puppet

假设我有一个安装包的配置文件。安装后,它 运行 有一些 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 资源中执行命令?

这个答案分为两部分,以解决您对一般刷新关系的查询的两种可能解释。

刷新事件并从其他 classes

订购

让我尝试用更笼统的术语重写我对您问题的理解。您在问:

问题

假设Exec资源Yrefreshonly => true订阅到classA中的资源X。然后假设资源Z需要 class 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,如果是这样,考虑到X和Y可以,刷新事件是否一定会到达Exec资源Y时间上被Z隔开?

回答

是的,是的。回想一下,Puppet 构建了一个有向无环图,并通过遍历该图计算最终顺序。此代码导致两种可能的时间排序,X、Y、Z 和 X、Z、Y(使用 puppet apply /tmp/code.pp --ordering=random 尝试几次)。

但这没关系,因为 Puppet 还会跟踪已收到刷新事件的资源队列。

如果包 A 被 Puppet 外部的包管理器安装为包 B 的依赖项怎么办

您也可能询问 Puppet 之外存在的 RPM 或其他包管理器级别的依赖项。既然如此,Puppet自然不可能知道这些。

如果是,是的,如果包管理器(或 Puppet 之外的任何其他东西)满足订阅,则不会发送刷新事件。