Puppet 通知如何遍历傀儡资源链?

Puppet 通知如何遍历傀儡资源链?,puppet,Puppet,在这个简化的Puppet示例中,很明显,对my_文件的任何更改都会触发my_服务刷新,因为~>链接操作符: package { 'my_package': } -> file { 'my_file': } ~> service { 'my_service': } 更改为my\u程序包是否也会导致my\u服务刷新?(也就是说,状态更改是否会通过非通知的->链操作符传播?) 我知道,如果所有操作员都通知操作员,刷新事件将通过一个链传播,但文档不清楚它在混合链中是如何工作的。通知从不通过

在这个简化的Puppet示例中,很明显,对
my_文件的任何更改都会触发
my_服务
刷新,因为
~>
链接操作符:

package { 'my_package': }
->
file { 'my_file': }
~>
service { 'my_service': }
更改为
my\u程序包
是否也会导致
my\u服务
刷新?(也就是说,状态更改是否会通过非通知的
->
链操作符传播?)

我知道,如果所有操作员都通知操作员,刷新事件将通过一个链传播,但文档不清楚它在混合链中是如何工作的。

通知从不通过另一个资源传播,即使它们位于设置为通知的资源链中

当一个资源被“更改”时,它会通知所有订阅了它自己的更改的资源。这些资源有一个调用的
refresh
方法,该方法执行该类型所需的任何操作。在那之后,没有其他事情发生

如果通知的资源本身发生了更改,则它还将通知订阅其更改的任何人。这不是传播通知,而是通过清单传播更改

例如,如果
/tmp/markerfile
已存在,则此清单将不应用exec资源:

notify { 'test': }
~>
file { '/tmp/markerfile':
  ensure => present
}
~>
exec { '/bin/date':
  refreshonly => true
}

所以在我的例子中,假设
myu包
是nginx,
myu文件
是nginx配置文件,
myu服务
是nginx服务。如果出于某种原因,nginx配置文件已经存在,那么包的安装将永远不会触发服务的启动?我想这是有道理的,但是有这么多的链接示例,在服务的末尾有一个最后的
~>
。@ScottSB在这种情况下,您仍然会启动服务(如果它还没有运行并且
确保=>正在运行)。通知服务将重新启动已在运行的服务。因此,在您的示例中,它不会重新启动已经运行的服务。这有点拐弯抹角,因为如果包没有安装,那么服务可能无论如何都不会运行,并且将由服务资源启动。你是对的。我仍然觉得这会留下一些令人惊讶的边缘案例,但现在我知道了这些行为,不值得尝试去识别它们。我将确保直接从任何可能需要刷新服务(或exec)的资源发出通知。