Ресурс "шаблона" Chef в AWS OpsWorks: проверьте, существует ли целевой файл

У меня есть следующая проблема. Фрагменты кода рецепта шеф-повара ниже не ведут себя одинаково, хотя они выглядят одинаково для меня с точки зрения чистой логики.

template "Create a file if not exists" do
  path "#{site_docroot}/somefile.php"
  source 'somefile.php.erb'
  action :create_if_missing
end

VS.

if !File.exists? "#{site_docroot}/somefile.php"
    template "Create a file if not exists" do
      path "#{site_docroot}/somefile.php"
      source 'somefile.php.erb'
      action :create
    end
end

Оба должны создать файл, если он еще не существует. Но в контексте пользовательского рецепта на этапе "настройки" Amazon OpsWorks первое решение работает, как и ожидалось. Но второе решение дает "ложное срабатывание" ровно каждый второй раз, когда я запускаю рецепт. Оператор if возвращает false, но файл не существует в конце.

Поэтому я хотел бы знать, есть ли какая-либо причина для этого в chef или / и ruby ​​с вложенным ресурсом "template" в блок "if". Ресурс "шаблона" запускается какой-то асинхронный?

1 ответ

Решение

Краткий ответ: шеф-повар работает в 2 этапа. У вас есть фаза компиляции и фаза выполнения (или иногда называемая конвергенция).
Это означает, что в зависимости от наличия файла шаблон будет вставлен или нет в рецепте во время компиляции.

Дальнейшее чтение:
https://docs.chef.io/chef_client.html
https://serverfault.com/questions/604719/chef-recipe-order-of-execution-redux

Итак, что происходит в вашем случае:

  • Сначала нет файла. Рецепт шеф-повара (на этапе компиляции) решает, что должен быть файл, и создает файл на этапе конвергенции.
  • во 2-ой серии есть файл, и рецепт шеф-повара решает (снова через компиляцию), что файла не должно быть (т.е. отсутствует шаблон). Когда узел сходится на втором этапе, шеф-повар удаляет файл, пытаясь привести узел в нужное состояние.

Это объясняет то, что вы видите, как вы видите (каждый второй бег)

Другие вопросы по тегам