我们正在使用 Puppet 来管理 OpenStack 安装。OpenStack 由许多松散连接的部分组成,所有部分都通过 AMQP 进行通信。几个部分使用一个公共配置文件 ( /etc/nova/nova.conf
),因此典型的服务资源如下所示:
service { 'openstack-nova-network':
ensure => running,
enable => true,
subscribe => File['/etc/nova/nova.conf'],
}
这一切都很好。
现在我们正在使用 Puppet 为一些底层 Python 代码安装修补程序。当我们替换其中一个 Python 源文件时,我们想重新启动使用它的服务。通常,这与订阅的服务集完全相同
/etc/nova/nova.conf
。
我希望我可以通过通知文件来利用现有的依赖关系,就像这样......
file { '/path/to/some/file':
source => 'puppet:///.../',
notify => File['/etc/nova/nova.conf'],
}
...但这似乎没有用。除了
notify
为每项服务添加明确的条目外,还有更好的方法吗?
更新
你知道,我开始怀疑我的问题并不完全清楚。对于造成的混乱,我深表歉意,并尝试让我的要求更明确一点:
我意识到我可以使用一组显式依赖项来做到这一点,无论是作为subscribe
服务的notify
值还是已安装文件的值。问题是这意味着要维护一个 M*N 的依赖矩阵。引入新文件意味着:
- 更新 M
service
资源,或 - 更新 N 个
file
资源
这种重复复制粘贴的工作很容易出错,尤其是在多人负责配置的情况下。
一种选择是维护一个中央服务列表:
$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 的所有服务”,使用-resources 似乎是不可能的
file
。但是,它与exec
-resources 和refreshonly
-parameter 一起使用。(刚刚用Puppet 2.7.11测试了类似的配置)。您必须添加一个虚拟exec
资源:命令运行时,
exec
向其所有订阅者发送通知。并且refreshonly
-parameter 确保该命令仅在刷新时运行。订阅此 Exec 的所有服务:
并使用来自所有文件资源的通知。(也为 执行此操作
/etc/nova/nova.conf
,或在每个 的订阅列表中指定它service
):并做了。任何文件的更改都会触发订阅的所有服务的刷新
'dummy-nova-refresh'
。我不是这两种技术的真正专家,但我认为您必须订阅要重新启动的服务以替换文件。就像是:
不确定这个语法是否写得正确,但我希望你明白了。
那应该有效。