Рецепт шеф-повара include_recipe имеет приоритет перед другим кодом и ресурсами - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь создать поваренную книгу шеф-повара, которая на данный момент является в основном просто поваренной книгой-оберткой для другой поваренной книги ( контрольная поваренная книга ). Я все еще изучаю Chef, но из того, что я могу почерпнуть из документации О рецептах и Справочной документации по ресурсам , рецепты Chef должны выполняться в том порядке, в котором они определены (черезКод Ruby и / или ресурсы Chef).

В документации О рецептах упоминается, что

Когда рецепт включен, ресурсы, найденные в этом рецепте, будут вставлены (вточно такой же порядок) в том месте, где находится ключевое слово include_recipe.

В справочной документации по ресурсам они имеют ресурс apt_update , который предположительно выполняется до include_recipe метод из-за того, что он был определен ранее в рецепте.

Моя кулинарная книга имеет один рецепт, default.rb, который буквально состоит из двух строк:

package 'ruby-dev'
include_recipe 'audit'

Однако во время запуска chef-client или chef-solo я вижу, что рецепт audit :: inspec выполняется до security :: default recipe, что приводит к поломке, потому что InSpec имеет некоторые другие зависимости, которые должны быть установлены заранее. Прежде чем использовать ресурс package , я использовал ресурс execute для явного запуска apt-get install ruby-dev или yum install ruby-dev в зависимости от платформы, используя оператор case, но та же проблема (весь этот кодбыл пропущен, и сначала вызывался метод include_recipe .

В случае, если это полезно, я использую Chef 12, который, как я понимаю, является EOL, но у меня есть другие зависимости, которые требуют от меня придерживаться этоговерсия Chef на данный момент.

Я вполне могу просто неправильно понять, как Chef сходится в работе и порядке выполнения, но это вызывает у меня много горя, поэтому я действительно буду признателен за некоторые указатели! Всегда ли include_recipe предшествует другому коду в вашем рецепте? Есть ли способ обойти это? Я что-то упустил?

- РЕДАКТИРОВАТЬ -

Мне удалось получить желаемую функциональность (установить другие пакеты и гемы до установки, вызванной вызовом include_recipe)драгоценного камня зависимости), используя следующий код в моем рецепте поваренной книги:

package 'build-essential' do
  action :nothing
end.run_action(:install)

chef_gem 'train' do
  version "1.4.4"
  action :install
end

chef_gem 'signet' do
  version "0.11.0"
  action :install
end

include_recipe 'audit'

Обратите внимание, что в итоге я установил пакет build-essential вместо пакета ruby-dev из моего исходного фрагмента кода, а также установилдва драгоценных камня для использования клиентом Chef. Все это устанавливается в порядке, который я ожидал на этапе компиляции программы Chef.

Источники:

1 Ответ

1 голос
/ 10 октября 2019

если вы изучите audit::inspec rescipe, вы обнаружите, что он использует время компиляции установки inspec rubygem (см. Последнюю строку)

inspec_gem 'inspec' do
  version node['audit']['inspec_version']
  source node['audit']['inspec_gem_source']
  action :nothing
end.run_action(:install)

из документация chef :

run_action

Использование .run_action(:some_action) в конце блока ресурса для запуска указанного действия во время фазы компиляции.

...