Назад | Перейти на главную страницу

Несколько связанных ресурсов в рецепте шеф-повара

Мне нужно запустить некоторые команды в зависимости от результата предыдущего выполнения, который снова зависит от установленного пакета.

При первом запуске я ожидал чего-то вроде:

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: иногда вы хотите убедиться, что ресурс настроен, прежде всего.