2015-04-16 3 views
1

У меня есть две кулинарные книги, первая устанавливает некоторые RPM, а вторая настраивает некоторые конфигурации. Если правильный RPM уже установлен и обновленная cookbook1 ничего не делает, однако cookbook2 не знает об этом и применяется каждый раз.Можно ли просмотреть и использовать возвращаемое значение метода include_recipe?

include_recipe 'cookbook1' 
include_recipe 'cookbook2' # < this cookbook should run only if cookbook1 

Можно ли использовать cookbook2 на основании того, что cookbook1 не вносил никаких изменений?

Это мое текущее решение: Я проверяю, если текущая установленная версия RPM соответствует тому, что я хочу, а затем использовать, если заявление, чтобы решить, если мне нужно применить cookbook2:

version_match = system "rpm -qa | grep yum-3.2.22-40.el5.centos" 
include_recipe 'cookbook1' 

if !version_match 
    include_recipe 'cookbook2' 
end 

Спасибо!

ответ

0

Лучшая ставка для передачи временных данных между рецептами node.run_state(doc reference). Он никогда не будет сохранен на сервере Chef, что является преимуществом с использованием объекта node.

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

+0

Возможно, вы можете показать, как использовать node.run_state с этим прецедентом, где бы вы ни запускали, нет смысла использовать его для текущего состояния здесь, не нуждающегося в пропуске, выполненном в том же прогоне. Это просто трата циклов процессора. – Tensibai

1

Чтобы ответить на ваш вопрос - нет. include_recipe - это метод, а не ресурс. Он потребляется на этапе компиляции запуска chef-client и не знает о состоянии машины в этой точке.

Моя рекомендация - использовать блоки not_if/only_if во втором рецепте. https://docs.chef.io/resource_common.html#not-if-examples

Причиной этого является контроль состояния сервера. Кроме того, «в реальном мире» клиент-шеф-повар работает с интервалом, как правило, каждые две минуты на тысячах серверов.

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

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

Смежные вопросы