木偶:在文件之前创build服务,但如果文件更改通知服务

我想要在服务nginx后创build文件“运行”,但也想通知服务nginx如果文件运行的变化。 通知意味着它在nginx之前运行。

用例如下。 我们使用dj bernsteins daemontools来pipe理nginx。 由于我们需要做一些步骤(创build/ etc / service,添加运行文件..),我们build立一个定义的types来完成这些事情。 现在我们不希望我们的nginx模块与daemontools模块有任何连接,这就是为什么我们不想订阅daemontools文件。 也订阅会扭转依赖周期。 我正在寻找类似的东西,只有在模块nginx完成时才运行模块。

class { daemontools: file {'run': require => Service[nginx], notify => Service[nginx]; # <<< this wont do :( } } class { nginx: service { 'nginx': } } 

有任何想法吗?

托马斯

    如果你的用例可以处理它的限制,你可以尝试使用阶段 。

     stage { 'first': before => Stage['main'], } stage { 'last': } Stage['main'] -> Stage['last'] class { daemontools: stage => last; file {'run': require => Service[nginx], notify => Service[nginx]; } } class { nginx: stage => last; service { 'nginx': } } 

    这并不是一件容易的事情,因为问题在第一次运行后就会改变。 我的问题中描述的问题仅适用于必须configuration的服务器是全新的。

    首先运行:等待所有文件被复制(完成nginx类),然后放置运行文件

    第二次运行:对运行文件采取通常的通知方式。 这次它可以在服务之前运行。 这在第一次运行时不起作用。

    所以我们通过添加一个名为nginx-ready的“状态”文件来解决这个问题

    所以在我们定义的typesadd_daemontools.pp

      define daemontools::add_service { file { "/etc/service/${service}/run": ensure => file, mode => 0755, owner => root, group => root, content => template("daemontools/service.erb"), path => "/etc/service/$service/run", # create run file when service is ready require => File["/var/run/${service}-ready"], # notify implies before notify => Service["${service}"], } } 

    在我们的模块中,我们创build了准备好的文件,这取决于所有必要的东

      class nginx ( ... params) { ... file { '/var/run/nginx-ready': require => [ Package[$nginx_dependencies], File[$nginx_files] ], before => Service['nginx'], content => 'ready file for daemontools', } } 

    非常感谢您的帮助!