如何多次使用不同的参数运行相同的厨师配方
问题描述:
我有一个配方,在文件系统上安装一个进程,然后是一个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
是否有我可以隔离每个过程的厨师跑?
答
厨师工作的方式最终会得到一个资源execute[configure]
,这将基于最后的key
value
。
如果使用循环创建资源,请确保所有资源都有唯一的名称。
例如
execute "configure-#{key}-#{value}"
否则结果将是不可预测的。
尝试使用'execute“configure#{some_key}”do“为每个目录获取唯一的执行命令,并在通知中使用相同的语法。如果没有这些资源覆盖前一个资源(简短的解释,它会更复杂一点)。我使用'remote_directory'和通知来重新启动服务而不是'execute'。 – Tensibai
你应该实现一个[定义](http://docs.chef.io/definitions.html)或[lwrp](https://docs.chef.io/lwrp.html),你将能够即使在食谱中也可以重用。你总是可以迭代地调用其中任何一个。 – MrRoth