Мне нужно запустить некоторые команды в зависимости от результата предыдущего выполнения, который снова зависит от установленного пакета.
При первом запуске я ожидал чего-то вроде:
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
установлен. Я бы очень хотел просто упорядочить эти части, используя рубиновый блок (принудительное выполнение при обработке ресурсов), но тогда мне кажется, что я не могу вложить исполняемые ресурсы внутри ресурса рубинового блока.
Как я могу это правильно реализовать?
Рецепт выглядит примерно так:
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, что Chef запускает ресурсы того же типа, что и пакет. Итак, то, как вы вызываете установку (и последующее добавление / удаление), может иметь значение.
Вы можете посмотреть на Выполнить ресурс
Документация Chef: иногда вы хотите убедиться, что ресурс настроен, прежде всего.