我需要根据以前的执行结果来运行一些命令,这又取决于正在安装的一些软件包。
在第一次运行,我期望像这样:
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包的get output部分将在package 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
你能分享你的食谱吗? 不幸的是,我找不到一个参考,但我记得在Opscode网站上阅读,厨师运行同批次的资源。 所以,你如何调用安装(和后续的添加/删除)可能很重要。
你可能想看看执行资源
厨师文档:有时你想确保资源configuration在其他任何东西之前。