我需要根据上次执行的结果运行一些命令,而这又取决于正在安装的某些包。
在第一次运行时,我期望得到如下结果:
install package "XXX"
get output from XXX
for each line in output:
if missing, use XXX to add
if unknown, use XXX to delete
问题是,当我在配方的顶层执行逻辑时,该get output
部分将在安装包之前发生XXX
。我真的很想使用 ruby 块(在处理资源时强制执行)对这些部分进行排序,但似乎我无法在 ruby 块资源内嵌套执行资源。
我该如何正确实现这一点?
食谱大致如下:
flavors_bag = data_bag_item('nova', 'flavors')
cmd = Chef::ShellOut.new("nova-manage flavor list")
flavors = cmd.run_command.stdout
flavors_bag['spec'].each do |flavor|
execute "nova-manage flavor create #{flavor['name']} #{flavor['ram']*1024} #{flavor['cpu']} #{flavor['disk']} #{flavor['id']}" do
action :run
not_if {flavors.include? flavor['name']}
end
end
['some', 'old', 'values'].each do |flavor_name|
execute "nova-manage flavor delete #{flavor_name}" do
action :run
only_if {flavors.include? flavor_name}
end
end
答案1
你能分享一下你的食谱吗?不幸的是,我找不到参考资料,但我记得在 Opscode 网站上读到过 Chef 以批处理方式运行相同类型的资源。因此,你如何调用安装(以及随后的添加/删除)可能会很重要。
你可能想看看执行资源