Можно ли принудительно загрузить run_list в клиентском режиме shef (chef shell)

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

Проблема в том, что если chef-client не работает при первом запуске, run_list оказывается пустым, а shef даже удаляет (очень необходимые) рецепты из кеша, говоря, что "его поваренная книга больше не нужна на этом клиенте". Есть ли способ заставить shef разрешить мне использовать мой run_list?

Официальная вики упоминает:

«Список выполнения будет установлен так же, как и обычный запуск клиента шеф-повара».

но попытка "-j" не помогает.

Я также попытался запустить соло-режим ("-s -j"), как описано в этом запись в блоге. Он загружает run_list (не расширяя его, что странно), но когда я пытаюсь что-то сделать, я получаю что-то вроде:

«Tomcat для кулинарной книги не найден. Если вы загружаете tomcat из другой кулинарной книги, убедитесь, что вы настроили зависимость в своих метаданных».

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


person yoniLavi    schedule 11.10.2012    source источник
comment
Я предполагаю, что он не расширяет список выполнения в соло-режиме, поскольку расширение списка выполнения является частью интерфейса API Chef Server (см. POST cookbook_versions в /environments) и требует некоторого кода решения зависимостей, который, возможно, невозможен с Chef solo.   -  person Tim Potter    schedule 12.10.2012


Ответы (2)


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

Поэтому вам нужно использовать include_recipe, чтобы включить рецепты, которые вы хотите использовать. Вы можете сделать это автоматически для всех ролей/рецептов в списке выполнения узла с помощью:

node.run_list.expand(node.chef_environment).recipes.each do |r|
  include_recipe r
end

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

person jtimberman    schedule 12.10.2012
comment
Спасибо, это был отличный пост, чтобы прочитать. При первой попытке я все еще получал те же ошибки Cookbook xyz not found, так как список запуска еще не был заполнен для этого узла, но затем я перечитал Мы можем использовать include_recipe только для рецептов, которые Шеф скачал, когда мы его запустили. и тут меня осенило. Я загрузил run_list вручную с помощью knife node run_list add, а затем запуск только shef -z работает хорошо без необходимости передавать run_list в json. - person yoniLavi; 13.10.2012
comment
Нужно использовать node.run_list.expand(node.environment, 'disk') для шеф-повара соло - person omribahumi; 13.03.2017

Когда Chef запускается в первый раз, он создает файл /etc/chef/first-boot.json со списком запуска внутри. Попробуйте запустить:

shef -z -j /etc/chef/first-boot.json
person Draco Ater    schedule 11.10.2012
comment
Нет, как я упоминал выше, у меня это ничего не загружает (но частично работает в режиме -s). Если это имеет значение, сейчас я использую версию 10.12.0, но я помню такое поведение и в других версиях. Работает ли это для вас? - person yoniLavi; 11.10.2012