厨师食谱中的多个相关资源

厨师食谱中的多个相关资源

我需要根据上次执行的结果运行一些命令,而这又取决于正在安装的某些包。

在第一次运行时,我期望得到如下结果:

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 以批处理方式运行相同类型的资源。因此,你如何调用安装(以及随后的添加/删除)可能会很重要。

你可能想看看执行资源

Chef 文档:有时您想确保在执行任何其他操作之前先配置资源。

相关内容