如何多次使用不同的参数运行相同的厨师配方

问题描述:

我有一个配方,在文件系统上安装一个进程,然后是一个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

厨师工作的方式最终会得到一个资源execute[configure],这将基于最后的keyvalue

如果使用循环创建资源,请确保所有资源都有唯一的名称。

例如

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

否则结果将是不可预测的。