2017-02-15 75 views
1

通知服務,我已經創建木偶 - 中定義的資源

  1. 2個定義的資源下載的應用程序,並將其設置爲服務

  2. 的服務

創建配置文件

我想要1在2之前運行,因爲1會創建2創建配置文件的目錄。

但我還需要的是,如果配置文件更新,它應該通知1中的服務進行刷新。這是我遇到問題的地方,因爲我似乎無法訪問該服務。

這裏是我使用的示例代碼:

class start { 
    resource::run_service{'start'} 
    -> 
    resource::conf:service_conf{'conf'} 
} 

define resource::run_service { 
    # Does some things 
    service { 'main': 
     ensure => 'running', 
     enable => true 
    } 
} 

define resource::conf::service_conf { 
    file { 'file.config': 
     ensure => file, 
     path => '/some/path/', 
     owner => 'user', 
     group => 'group', 
     mode => 0600, 
     content => template('templates/templatefile.erb'), 
     notify => Resource::Run_service::Service['main'], # What is the proper way to do this? 
    } 
} 

這是我從木偶出現錯誤:

錯誤:服務器錯誤400:無法檢索從遠程服務器的目錄:無效的關係:因爲Resource :: Run_service :: Service ['main']似乎不在目錄

我可以這樣做:

notify => Resource::Run_service['main'], 

但它給了我一個依賴週期。

有沒有一種方法可以刷新服務?

回答

2

這裏的一些問題:

  • resource::run_service{'start'} -> resource::conf:service_conf{'conf'}被指定的依賴是你指定什麼,你的願望(2 1日前)的對面。我認爲這是一個錯字,因爲它與你的問題的其他部分相矛盾。
  • 您應該將已定義的資源類型放入自己的清單中。
  • 您從定義的資源類型中不能獲得真正的附加價值,這些資源類型不包含任何參數,也不會使用固有的$title變量,因此您可能需要刪除它們。至少,您應該重新組織它們,以便配置文件的目錄創建與配置文件具有相同的定義資源類型。
  • Resource::Run_service::Service['main']不是一個有效的資源名稱,所以這就是爲什麼你得到「不在目錄中」的錯誤。本地資源類型沒有名稱空間,因此您無需在它們之前指定定義的資源類型名稱空間。
  • 您需要使用mode屬性值的八進制字符串。這是Puppet中的一個錯誤,因爲它可能導致在Ruby中進行類型轉換時出現未定義的行爲。

有了這些想法,你前進的最簡單的途徑是:

class start { 

} 

define resource::run_service { 
    file { 'directory that contains config file': 
    ensure => directory, 
    before => File['file.config'], 
    } 

    # Does some things 
    service { 'main': 
    ensure => 'running', 
    enable => true 
    } 
} 

define resource::conf::service_conf { 
    file { 'file.config': 
    ensure => file, 
    path => '/some/path/', 
    owner => 'user', 
    group => 'group', 
    mode => '0600', 
    content => template('templates/templatefile.erb'), 
    notify => Service['main'], 
    } 
} 

這將讓你與你的痛苦最少的願望的行爲。

+1

儘管「您從沒有參數的定義資源類型中不能獲得真正的附加價值」是真實的,因爲它適用於OP問題的細節,但作爲一般規則並不正確。每個定義的類型實例都有一個內部可訪問的'$ title'(也可以作爲'$ name'訪問),並且它的使用可以使該類型提供附加值(因爲可以有效聲明多個實例)。實際上,我甚至會說,它主要是使用'$ title',而不是參數的存在或缺失,它決定了一個定義的類型是否提供附加價值。 –

+0

@JohnBollinger好點。讓我更新我的重點。 –

+0

你對錯字是正確的,我已經修復了OP。資源是在他們自己的清單中,我只是格式化它,所以它更容易閱讀。 看起來像我不知道的主要事情是本地資源沒有名稱空間。我認爲我在發佈我的問題之前沒有使用命名空間嘗試它,但是我這樣做時可能沒有大寫「Service」,因爲它沒有工作。 無論如何,我已經接受你的答案。謝謝。 –