我们使用 Puppet 来管理 OpenStack 安装。OpenStack 由许多松散连接的部分组成,所有部分都通过 AMQP 进行通信。几个部分使用一个通用配置文件 ( /etc/nova/nova.conf),因此典型的服务资源如下所示:
service { 'openstack-nova-network':
ensure => running,
enable => true,
subscribe => File['/etc/nova/nova.conf'],
}
Run Code Online (Sandbox Code Playgroud)
这一切都很好。
现在我们使用 Puppet 来安装一些底层 Python 代码的修补程序。当我们替换 Python 源文件之一时,我们希望重新启动使用它的服务。通常,这与订阅的服务集完全相同
/etc/nova/nova.conf。
我希望我可以通过通知文件来利用现有的依赖项来做到这一点,就像这样......
file { '/path/to/some/file':
source => 'puppet:///.../',
notify => File['/etc/nova/nova.conf'],
}
Run Code Online (Sandbox Code Playgroud)
...但这似乎不起作用。除了notify为每个服务输入显式
条目之外,还有更好的方法来做到这一点吗?
更新
你知道,我开始怀疑我的问题并不完全清楚。我想为造成的混乱道歉,并尽量让我的要求更明确一点:
我意识到我可以使用一组显式依赖项来做到这一点,无论是作为subscribe服务的notify值还是已安装文件的值。问题是这意味着维护一个 M*N 的依赖矩阵。引入新文件意味着:
service资源,或file资源这种重复的复制粘贴工作很容易出错,尤其是当多人负责配置时。
一种选择是维护一个中央服务列表:
$services = [ service1, service2, service ]
Run Code Online (Sandbox Code Playgroud)
因为那时我可以这样做:
file { '/usr/lib/python/glance/notifier/notify_qpid.py':
notify => Service[$services],
}
Run Code Online (Sandbox Code Playgroud)
但这行不通,因为不同主机上的服务列表不同。可能我可以翻转它并维护一个“修补程序”文件列表:
$hotfix_files = [
'/usr/lib/python2.6/site-packages/glance/notifier/notify_qpid.py',
'/root/puppet/modules/openstack/files/nova/impl_qpid.py',
]
Run Code Online (Sandbox Code Playgroud)
然后更新所有服务定义一次:
service { 'openstack-nova-network':
ensure => running,
enable => true,
subscribe => [
File['/etc/nova/nova.conf'],
File[$hotfix_files],
]
}
Run Code Online (Sandbox Code Playgroud)
但这仍然需要手动维护修改文件列表。
我真正想做的是说,“通知所有订阅的服务/etc/nova/nova.conf”。
您所追求的主要内容是“通知订阅 /etc/nova/nova.conf 的所有服务”,似乎无法使用file-resources。但是,它与exec-resources 和refreshonly-parameter 一起使用。(刚刚用Puppet 2.7.11测试了类似的配置)。您必须添加一个虚拟exec-resource:
exec {'dummy-nova-refresh':
command => "/bin/true",
refreshonly => true,
}
Run Code Online (Sandbox Code Playgroud)
当命令运行时,exec向其所有订阅者发送通知。并且refreshonly-parameter 确保该命令仅在刷新时运行。
订阅此 Exec 的所有服务:
service { 'openstack-nova-network':
ensure => running,
enable => true,
subscribe => Exec['dummy-nova-refresh'],
}
Run Code Online (Sandbox Code Playgroud)
并使用来自所有文件资源的通知。(也为 执行此操作/etc/nova/nova.conf,或在每个 的订阅列表中指定它service):
file { '/path/to/some/file':
source => 'puppet:///.../',
notify => Exec['dummy-nova-refresh'],
}
Run Code Online (Sandbox Code Playgroud)
并做了。任何文件的更改都会触发订阅的所有服务的刷新'dummy-nova-refresh'。
| 归档时间: |
|
| 查看次数: |
12900 次 |
| 最近记录: |