Назад | Перейти на главную страницу

Есть ли более элегантный способ удаленного запуска chef-client?

Этот способ рекомендуется в руководстве Chef Fast Start:

knife ssh name:mynode -a ipaddress  -x ubuntu -i mycredentials.pem "sudo chef-client"

Это действительно коряво. Действительно ли нет лучшего способа, или есть идея, что в реальной производственной среде у вас все равно будет автоматическое обновление узлов?

Вы могли бы использовать нож ssh для запуска chef-client на всех ящиках, содержащих определенную роль или рецепт:

knife ssh "role:web" "sudo chef-client" -x ubuntu --sudo 

Или, если вы находитесь в EC2:

knife ssh "role:web" "sudo chef-client" -x ubuntu -a ec2.public_hostname 

Это примерно то же самое, с чего можно начать, но это нужно сделать только один раз. Первоначальный запуск chef-client обычно включает и запускает демон chef-client как службу init.d.

Если вы действительно хотите сделать это более элегантно, вы можете отказаться от Knife-ssh и запустить ssh напрямую:

ssh ubuntu@ipadddress -i mycredentials.pem sudo chef-client

это, вероятно, будет быстрее, так как Knife-ssh выполняет поиск на сервере Chef, чтобы получить узлы, соответствующие поисковому запросу (в данном случае name:dynode), что вам не обязательно делать, если вы уже знаете IP-адрес.

Вы можете использовать ansible для развертывания и запуска chef-client.

$ ansible -i hosts all -a 'chef-client'

ansible легко устанавливается с помощью pip:

pip install ansible

Ваш файл инвентаря (в примере с именем "hosts") может выглядеть следующим образом:

[all] host1.example.com ansible_user=root host2.example.com ansible_user=root host3.example.com ansibel_user=root

(обратите внимание, что "all" - это имя группы в файле конфигурации для нашего примера - это произвольно и может быть любым. Ваш файл инвентаризации может также включать другие группы, например [web_wervers], [database_servers], [chef_servers] , и т.д.)

Итак, снова собираем все вместе:

> ansible -i hosts all -a 'chef-client'

или, может быть:

> ansible -i hosts all -a 'systemctl status'

Я использую Jenkins CI для управления запусками. Сервер Linux настроен как рабочая станция и на нем установлен Jenkins. Таким образом, я могу загрузить узлы с помощью модифицированного run_list. В любом случае, процесс начальной загрузки в конце запускает chef-client.

Для специального выполнения задание Jenkins выполняет ножевые команды для изменения run_list для узла и для использования плагина SSH для выполнения chef-client на желаемом узле.

Жалко, что для отправки команды клиенту chef мы должны использовать подчеркивание ssh.

Кажется, что хотя каждый клиент Chef установил безопасное соединение с сервером Chef, но сервер Chef не предоставляет мультиплексор команд через это безопасное соединение, почему?

Появилась новая команда chef-run в рабочей станции шеф-повара:

chef-run server_name resource_name

Он установит chef-client если нет, запустите указанный ресурс или кулинарную книгу.

Руководство: https://learn.chef.io/modules/try-chef-infra#/