Puppet:在文件之前创建服务但如果文件更改则通知服务

tom*_*ics 5 puppet dependencies

我希望在服务 nginx 之后创建文件“运行”,但如果文件运行发生更改,我也想通知服务 nginx。通知意味着它在 nginx 之前运行。

用例如下。我们使用 dj bernsteins daemontools 来管理 nginx。由于我们需要执行一些步骤(创建 /etc/service,添加运行文件..),我们构建了一个定义的类型来执行这些操作。现在我们不希望我们的 nginx 模块与 daemontools 模块有任何连接,这就是我们不想订阅 daemontools 文件的原因。订阅也将扭转依赖循环。我正在寻找类似的东西,只有在模块 nginx 完全完成时才运行模块。

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

class { nginx: 
  service { 'nginx': }
}    
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

托马斯

tom*_*ics 2

这不是一件容易的事,因为问题在第一次运行后就发生了变化。我的问题中描述的问题仅适用于必须配置的服务器是全新的时。

首次运行:等待所有文件复制完成(class nginxcomplete)然后放置运行文件

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

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

所以在我们定义的类型add_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}"],
      }
  }
Run Code Online (Sandbox Code Playgroud)

在我们的模块中,我们创建了准备好的文件,该文件取决于所有必要的内容。

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

非常感谢您的帮助!