我可以让Puppet订阅一个目录,以便对任何文件的更改触发一个服务重新加载?

我们有一个基本的'nginx'类,节点的类包含这个基类,并将它们的configuration文件添加到/etc/nginx/conf.d下

我想让nginx服务在一个位置订阅/etc/nginx/conf.d,这样编写节点类的人不必记得添加notify => Service['nginx'] 。 我已经尝试使用下面的这个Puppet代码,但它没有工作(即,我修改application.conf后,nginx服务没有重新加载)。

这可能吗?

模块/ nginx的/ init.pp

 class nginx { package { 'nginx': ensure => installed, } service { 'nginx': ensure => running, enable => true, hasstatus => true, hasrestart => true, require => Package['nginx'], subscribe => File['/etc/nginx', '/etc/nginx/conf.d'], } file { ['/etc/nginx', '/etc/nginx/conf.d']: ensure => directory, owner => application, group => application, recurse => true, } } 

模块/应用/ init.pp

 class application { file {'/etc/nginx/conf.d/application.conf': ensure => present, owner => application, group => application, source => 'puppet:///modules/application/application.conf', require => Package['nginx'], } } 

有了木偶,我发现如果你所做的事情不能立即奏效,你可能会试着做一些你不应该做的事情。 在这种情况下,您可能希望每个站点都只是在nginx / conf.d中放置一个configuration文件。 相反,您希望创build一个代表nginx虚拟主机的已定义资源。 在这个资源中,你需要把正确的configuration文件放到conf.d中,并通知nginx服务。

这样做的好处是可以标准化所有你需要的configuration。 例如,大多数nginx网站将需要gzip。 比方说,你忘了这个,你宁愿在你的默认模板中做这个改变,或者不得不find每个定义的nginxconfiguration改变? 或者可以说在用于HTTPS的密码中发现了另一个漏洞。 有了一个标准的nginxconfiguration,这是你需要改变它的一个地方。 随着每个应用程序放弃它自己的configuration文件,你将会在任何地方改变它。

如果您需要将常用function抽象为可重用的东西,那么最好的select是创build一个定义的types。 像这样的东西应该工作:

 define nginx::config_fragment ( $group, $owner, $source, ) { file { "/etc/nginx/conf.d/${title}.conf": ensure => 'file', group => $group, owner => $owner, source => $source, } } 

然后,在你的site.pp ,在资源types上设置一个默认值:

 Nginx::Config_fragment { group => 'application', owner => 'application', notify => Service['nginx'], } 

每当触发刷新时, file都会通知封闭的已定义types,然后再重新加载nginx服务。

不知道这是否工作,但如何创build一个简单的执行生成一个单一的文件,根据受监控目录的内容,订阅该文件,然后触发您的重新启动…

例如:

 class nginx { package { 'nginx': ensure => installed, } service { 'nginx': ensure => running, enable => true, hasstatus => true, hasrestart => true, require => Package['nginx'], subscribe => File['/etc/nginx', '/etc/nginx/conf.d'], } file { ['/etc/nginx', '/etc/nginx/conf.d']: ensure => directory, owner => application, group => application, recurse => true, } exec { "/tmp/nginx-config-checksum": path => "/usr/local/bin/:/bin:/usr/sbin", command => 'find /etc/nginx/conf.d | xargs md5sum > /tmp/nginx-config-checksum', } file { "/tmp/nginx-config-checksum" notify => Service['nginx'] } }