Puppet

Puppet:在文件之前創建服務,但如果文件更改則通知服務

  • April 7, 2014

我希望在服務 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': }
}

引用自:https://serverfault.com/questions/586472