Этот способ рекомендуется в руководстве 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#/