Puppet
Puppet:在文件之前創建服務,但如果文件更改則通知服務
我希望在服務 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': } }
有任何想法嗎?
托馬斯
這不是一件容易的事,因為第一次執行後問題發生了變化。我的問題中描述的問題僅適用於必須配置的伺服器是全新的。
首次執行:等待所有文件複製完成(nginx類完成)然後放置執行文件
第二次執行:對執行文件採取通常的通知方法。這次它可以在服務之前執行。這在第一次執行時不起作用。
所以我們通過添加一個名為 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', } }
非常感謝您的幫助!
如果您的案例可以處理其限制,您可以嘗試使用 using階段。
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': } }