我们正在使用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。 引入新文件意味着:
service资源,或 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'], ], }
这应该工作。