Dependencies 订阅puppet中的包

Dependencies 订阅puppet中的包,dependencies,puppet,subscribe,Dependencies,Puppet,Subscribe,假设我有一个安装包的配置文件。安装后,它运行一些exec命令。但是这些命令只需要在第一次安装包时运行一次 package { 'package1': ensure => 'present' } exec { 'signal_package_conf': command => 'systemctl restart package.service', path => '/sbin:/bin:/usr/sbi

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

这个答案分为两部分,以解决有关刷新关系的查询的两种可能的解释

刷新事件并从其他类排序

让我试着把我理解的你的问题改写成更一般的问题。你在问:

问题:

假设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,如果是,考虑到X和Y在时间上可能被Z分开,刷新事件是否一定会到达Exec资源Y

答复

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

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

如果Puppet之外的包管理器将包A作为包B的依赖项安装,该怎么办

您也可能询问RPM或其他存在于Puppet之外的包管理器级别的依赖关系。如果是这样,木偶自然不会知道这些


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

我看到了该选项,但如果我将
重新安装在刷新上
设置为true,它是否也会在每次Puppet运行时重新安装?正如我提到的,只有在同时实现了可重新安装的情况下,此时,它只为
provider=>portage
实现。如果您在Gentoo上,可能这是一个真正的问题?在您的示例中,类
a
b
将由puppet管理。我的意思是当我在另一个配置文件中执行
package{'package1':确保=>present}
,该配置文件作为依赖项
package2
安装(在我的情况下,这是使用
yum
完成的,
package2
的安装对puppet来说是未知的)。现在,如果我有一个订阅了
package2
exec
,它还会运行吗?是的,请参阅第三部分。re:第一点:我不相信询问者正在尝试刷新
资源,我也没有在问题中看到一个编辑历史记录来表明这一点。另一个超次要的点是,您还可以使用调用提供程序中特定内容的类型中的方法来启用
可刷新