我有一个配方在文件系统上安装一个进程,然后一个runit服务来管理进程 - 最终通知命令将唯一配置复制到进程主目录并重新启动进程。这适用于单个进程 - 但是当我尝试多次运行时,即。当循环遍历属性时,我得到了与生命周期相关的奇怪副作用。
我得到错误的一个例子
Chef::Exceptions::EnclosingDirectoryDoesNotExist
用于/ srv / second-process。然而,这个目录是我在提供者内部的通知块中创建的第一个目录 - 可能是主厨不是孤立的吗?我还看到第一个数组项的数据泄漏到另一个数组中。第一个进程尝试通知r_unit [second-process-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 provider
class Provider < Chef::Provider
def action_enable
deploy_revision current_process_id do
new_resource.updated_by_last_action(true)
end
end
end
有没有办法可以隔离每个过程的厨师运行?
答案 0 :(得分:0)
Chef的工作方式最终会使用一个资源execute[configure]
,该资源将基于上一个key
value
。
如果使用循环创建资源,请确保所有资源都具有唯一名称。
例如
execute "configure-#{key}-#{value}"
否则结果将无法预测。