是否有可能通知Puppet中的File 资源并触发订阅该文件的资源?

我们正在使用Puppet来pipe理OpenStack安装。 OpenStack包含许多松散连接的部分,所有部分都通过AMQP进行通信。 有几个部分使用一个通用的configuration文件( /etc/nova/nova.conf ),所以典型的服务资源如下所示:

 service { 'openstack-nova-network': ensure => running, enable => true, subscribe => File['/etc/nova/nova.conf'], } 

这一切都很好。

现在我们使用Puppet为一些底层Python代码安装一个修补程序。 当我们replace其中一个Python源文件时,我们希望重新启动使用它的服务。 一般来说,这与订阅/etc/nova/nova.conf的服务/etc/nova/nova.conf

我希望我可以通过通知文件来利用现有的依赖关系,像这样…

 file { '/path/to/some/file': source => 'puppet:///.../', notify => File['/etc/nova/nova.conf'], } 

…但这似乎没有工作。 除了为每项服务设置明确的notify条目之外,还有更好的方法来做到这一点吗?

UPDATE

你知道,我开始怀疑我的问题不是很清楚。 我想为这个混乱道歉,并试图让我的请求更加明确:

我意识到我可以做一个显式的依赖关系,无论是作为服务的subscribe值或notify安装的文件的值。 问题是这意味着维护一个M * N的依赖关系matrix。 引入新文件意味着:

  • 更新M service资源,或
  • 更新N个file资源

这种重复的复制和粘贴工作容易出错,尤其是在多人负责configuration时。

一种select是维护一个中央服务清单:

 $services = [ service1, service2, service ] 

因为那我可以这样做:

 file { '/usr/lib/python/glance/notifier/notify_qpid.py': notify => Service[$services], } 

但是这是行不通的,因为在不同的主机上服务列表是不同的。 可能我可以翻转,并维护一个“修补程序”文件列表:

 $hotfix_files = [ '/usr/lib/python2.6/site-packages/glance/notifier/notify_qpid.py', '/root/puppet/modules/openstack/files/nova/impl_qpid.py', ] 

然后更新所有服务定义一次:

 service { 'openstack-nova-network': ensure => running, enable => true, subscribe => [ File['/etc/nova/nova.conf'], File[$hotfix_files], ] } 

但是这仍然需要手动维护已修改文件的列表。

我真正想要做的就是说“通知所有订阅了/etc/nova/nova.conf的服务”。

你所要做的主要事情是“通知订阅了/etc/nova/nova.conf的所有服务”,对于file资源似乎不可能。 但是,它可以与exec一起使用,并且具有refreshonly参数。 (刚刚testing了与Puppet 2.7.11类似的configuration)。 您必须添加一个虚拟exec -resource:

 exec {'dummy-nova-refresh': command => "/bin/true", refreshonly => true, } 

当命令运行时, exec向所有用户发送通知。 refreshonly -parameter确保命令只在刷新时运行。

订阅此Exec的所有服务:

 service { 'openstack-nova-network': ensure => running, enable => true, subscribe => Exec['dummy-nova-refresh'], } 

并使用来自所有文件资源的通知。 (对于/etc/nova/nova.conf也是/etc/nova/nova.conf ,或者在每个service的订阅列表中指定它):

 file { '/path/to/some/file': source => 'puppet:///.../', notify => Exec['dummy-nova-refresh'], } 

并做了。 任何文件中的更改都会触发订阅'dummy-nova-refresh'所有服务中'dummy-nova-refresh'

在这两种技术上,我都不是专家,但我认为你必须订阅你想要重新启动的服务。 就像是:

  configfile { "/etc/httpd/conf/httpd.conf": source => "/httpd/httpd.conf", mode => 644, } service { httpd: running => true, subscribe => file["/etc/httpd/conf/httpd.conf"] } 

不知道这个语法是否正确书写,但我希望你明白了。

 service { 'openstack-nova-network': ensure => running, enable => true, subscribe => [ File['/etc/nova/nova.conf'], File['/path/to/some/file'], ], } 

这应该工作。