我们使用 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
”。
答案1
您所追求的主要目标是“通知所有订阅 /etc/nova/nova.conf 的服务”,这似乎无法通过file
-resources 实现。但是,它可以通过exec
-resources 和refreshonly
-parameter 实现。(刚刚测试了类似的配置木偶 2.7.11)。您必须添加一个虚拟exec
资源:
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
,或在每个 的订阅列表中指定它service
):
file { '/path/to/some/file':
source => 'puppet:///.../',
notify => Exec['dummy-nova-refresh'],
}
大功告成。任何文件的变更都会触发订阅的所有服务的刷新'dummy-nova-refresh'
。
答案2
我其实并不是这两种技术的专家,但我认为你必须将要重新启动的服务订阅到替换的文件。例如:
configfile { "/etc/httpd/conf/httpd.conf":
source => "/httpd/httpd.conf",
mode => 644,
}
service { httpd:
running => true,
subscribe => file["/etc/httpd/conf/httpd.conf"]
}
不确定这个语法是否正确,但我希望你能明白我的意思。
答案3
service { 'openstack-nova-network':
ensure => running,
enable => true,
subscribe => [
File['/etc/nova/nova.conf'],
File['/path/to/some/file'],
],
}
那应该可行。