Puppet:在文件之前创建服务,但如果文件发生变化,则通知服务

Puppet:在文件之前创建服务,但如果文件发生变化,则通知服务

我希望文件“run”在服务 nginx 之后创建,但如果文件 run 发生变化,我也希望通知服务 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': }
}    

有任何想法吗?

托马斯

答案1

您可以尝试使用阶段如果你的用例可以处理局限性

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': }
}

答案2

这不是一件容易的事,因为第一次运行后问题就变了。我的问题中描述的问题只适用于需要配置的服务器是全新服务器的情况。

第一次运行:等待所有文件复制完成(class nginx complete)然后放置运行文件

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

因此我们通过添加一个名为 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}"],
      }
  }

在我们的模块中,我们创建了依赖于所有必要条件的现成文件。

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

非常感谢您的帮助!

相关内容