2015-09-20 95 views
1

我有一個配方,在文件系統上安裝一個進程,然後是一個runit服務來管理進程 - 最終通知命令將獨特配置複製到進程主目錄並重新啓動進程。這對於單個進程工作正常 - 但是當我嘗試多次運行這個時,即。當循環訪問屬性時,我會看到似乎與生命週期相關的奇怪副作用。如何多次使用不同的參數運行相同的廚師配方

一個錯誤的一個例子,我得到

Chef::Exceptions::EnclosingDirectoryDoesNotExist 

爲/ SRV /第二處理。然而,這個目錄是我在提供程序內的通知塊中創建的第一個目錄 - 它可能是廚師跑步不是孤立的嗎?我也看到從第一個數組項泄漏到另一個即數據。第一進程嘗試通知r_unit [第二進程ID]

從廣義上講,(如果只有一個單一的過程這個工程)

node["app"]["processes"].each do |key,value| 

    #step 3 
    execute 'configure' do 

     command 'cp -r /srv/folder /srv/#{some_key} && sv restart #{some_key}' 
     action :nothing 

    end 
    #step 2 
    runit_service current_process_id do 

     notifies :run, 'execute[configure]', :delayed 

    end 
    #step 1 
    my_custom_hwrp current_process_id do 

     notifying_block do 

     new_resource.dirs_to_create.each do |dir_name| 

     end 

     install_path current_install_path 
     notifies :enable,"runit_service[#{current_process_id}]" 
     end 
    end 

end 

my_custom_hwrp提供商

class Provider < Chef::Provider 
    def action_enable 
     deploy_revision current_process_id do 

      new_resource.updated_by_last_action(true) 
     end 
    end 
end 

是否有我可以隔離每個過程的廚師跑?

+0

嘗試使用'execute「configure#{some_key}」do「爲每個目錄獲取唯一的執行命令,並在通知中使用相同的語法。如果沒有這些資源覆蓋前一個資源(簡短的解釋,它會更復雜一點)。我使用'remote_directory'和通知來重新啓動服務而不是'execute'。 – Tensibai

+0

你應該實現一個[定義](http://docs.chef.io/definitions.html)或[lwrp](https://docs.chef.io/lwrp.html),你將能夠即使在食譜中也可以重用。你總是可以迭代地調用其中任何一個。 – MrRoth

回答

0

廚師工作的方式最終會得到一個資源execute[configure],這將基於最後的keyvalue

如果使用循環創建資源,請確保所有資源都有唯一的名稱。

例如

execute "configure-#{key}-#{value}" 

否則結果將是不可預測的。

相關問題