Ресурс "шаблона" 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-ой серии есть файл, и рецепт шеф-повара решает (снова через компиляцию), что файла не должно быть (т.е. отсутствует шаблон). Когда узел сходится на втором этапе, шеф-повар удаляет файл, пытаясь привести узел в нужное состояние.
Это объясняет то, что вы видите, как вы видите (каждый второй бег)