Вступление
Chef - это система управления конфигурацией - она предназначена для предоставления повторяемого набораrecipes для построения вашей инфраструктуры, позволяя автоматизировать, обновлять и тестировать вашу инфраструктуру во многом так же, как и код вашего приложения.
Это шестой учебник из серииGetting Started Managing Your Infrastructure Using Chef. В этом руководстве мы предполагаем, что вы завершили остальные пять учебных пособий, и поэтому у вас есть сервер Chef, рабочая станция и один или несколько узлов в рабочем состоянии.
Наша цель
knife - это инструмент командной строки, входящий в состав Chef. Скорее всего, вы уже использовали нож для создания поваренных книг, пакетов данных или ролей Chef и управления ими. Когда вы вводите команду с ножом, вы обычно набираете что-то вроде:
knife cookbook create
В приведенном выше примере команды используется подкоманда ножаcookbook
. Это руководство познакомит вас с некоторыми новыми подкомандами ножа для выдачи команд и получения информации о вашем кластере Chef.
Мы покроем:
-
knife status
-
knife ssh
-
knife node
Предпосылки
В этом руководстве предполагается, что вы следовали до пятого руководства,How To Use the DigitalOcean Plugin for Knife to Manage Droplets in Chef, в серииGetting Started Managing Your Infrastructure Using Chef.
Создание примеров ролей и серверов
Если у вас нет установленного кластера Chef, или вы хотите внимательно следовать этому руководству и увидеть те же результаты, мы можем настроить несколько примеров ролей и серверов.
Во-первых, на вашемworkstation перейдите в свой каталогchef-repo
:
cd ~/chef-repo
Мы собираемся добавить рольbackend к существующей ролиweb_server. Пока это будет пустым, но позже вы можете превратить это в базу данных или сервер приложений.
nano roles/backend.rb
Добавьте это содержимое в файлbackend.rb
:
name "backend"
description "Backend for application servers"
Затем загрузите новую роль на свой сервер Chef.
knife role from file roles/backend.rb
Как только вы это сделаете, мы можем создать несколько образцов узлов с помощью плагина DigitalOcean Knife.
(Примечание:This plugin перестали обслуживаться с октября 2014 года. Это зависит от вас, хотите ли вы начать использовать его.)
knife digital_ocean droplet create --server-name frontend01 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[web_server]"
knife digital_ocean droplet create --server-name frontend02 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[web_server]"
knife digital_ocean droplet create --server-name backend01 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[backend]"
knife digital_ocean droplet create --server-name backend02 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[backend]"
Примечание: если ваши доменные имена для различных хостов в вашем кластере Chef не разрешаются извне, и вы заставляете их подключаться друг к другу с помощью отредактированных файлов/etc/hosts
, подготовка не будет работать, поскольку новый экземпляр сервера будет предоставлен файл по умолчанию/etc/hosts
.
У вас все еще могут быть активные узлы, которые вы создали в серии уроков Chef. Это означает, что некоторые команды, которые мы будем выполнять в этом руководстве, будут содержать дополнительные строки или информацию. Если вы хотите точно следовать инструкциям, вы всегда можете удалить эти узлы, нажавNodes > Delete в веб-интерфейсе сервера Chef.
Отображение статуса со статусом ножа
Подкомандаstatus
предназначена для отображения информации о состоянии ваших узлов. Чтобы использоватьknife status
, просто перейдите в каталогchef-repo
и введите:
knife status
Вы увидите список узлов, о которых знает ваш Chef-сервер, включая время их последних запусковchef-client
, имена узлов, полные доменные имена, IP-адреса и платформы.
3 minutes ago, frontend01, fe1.yourdomain.com, 111.111.111.111, ubuntu 14.04.
3 minutes ago, frontend02, fe2.yourdomain.com, 222.222.222.222, ubuntu 14.04.
20 hours ago, backend01, be1.yourdomain.com, 333.333.333.333, ubuntu 14.04.
3 minutes ago, backend02, be2.youdomain.com, 333.333.333.333, ubuntu 14.04.
Из этого сразу видно, что нам нужно внимательнее взглянуть наbackend01 - он не смог успешно запуститьchef-client
(«зарегистрирован» на языке шеф-повара) примерно за 20 часов.
Если у вас есть узел в подобной ситуации, проверьте журналы ошибокchef-client
или используйтеReports > Run History из веб-интерфейса сервера Chef.
Выдача команд с ножом SSH
Мы можем использоватьknife ssh
для одновременной выдачи команд нашим узлам (или некоторому подмножеству узлов). Например, мы можем использоватьknife ssh
для перезапуска Nginx на всех наших узлах с рольюfrontend.
Вам понадобится пользователь, авторизованный для SSH на сервере (т.е. вы можете запуститьssh [email protected]
и получить оболочку). Если у вас не настроены ключи SSH, вы можете использовать параметр-P
, чтобы запросить пароль.
knife ssh "role:web_server" "service nginx restart" -x yourusername -a ipaddress
Вы должны получить вывод, который выглядит так:
111.111.111.111 * Restarting nginx nginx [ OK ]
222.222.222.222 * Restarting nginx nginx [ OK ]
Мы просто выполнили команду на всех наших серверахfrontend, выполнив одну команду ножа. Давайте разберемся с аргументами и узнаем больше о том, как работаетknife ssh
.
knife ssh "web_server" "service nginx restart" -x yourusername -a ipaddress
Первый аргументknife ssh
- это поисковый запрос Chef - обычно вам нужно что-то вродеrole:YOUR_ROLE_NAME
, но вы также можете выполнять поиск по многим другим атрибутам (и комбинировать их с логическими операторами). Например, чтобы запустить команду только на узлах сubuntu в их атрибутеplatform, вы можете запустить:
knife ssh "platform:ubuntu*" "service nginx restart" -x yourusername -a ipaddress
* в приведенном выше примере является подстановочным знаком. Он будет соответствовать нулю или более символов в значении атрибута. В этом случае это позволит нам сопоставить значениеubuntu 14.04, отображаемое в выходных данныхknife status
, которые мы рассмотрели ранее.
knife ssh "role:web_server" "service nginx restart" -x yourusername -a ipaddress
Второй аргументknife ssh
- это команда, которую вы хотите запустить на серверах (которые соответствуют поисковому запросу). Это может быть почти все, что вы вводите в оболочку. Вы даже можете присоединяться к командам через точку с запятой (;).
knife ssh "role:web_server" "uptime;date" -x yourusername -a ipaddress
Который будет выводить что-то вроде:
111.111.111.111 12:53:36 up 2 days, 15:25, 1 user, load average: 0.08, 0.03, 0.05
111.111.111.111 Wed Oct 22 12:53:36 UTC 2014
222.222.222.222 12:53:30 up 2 days, 15:21, 1 user, load average: 0.00, 0.01, 0.05
222.222.222.222 Wed Oct 22 12:53:30 UTC 2014
Аргумент-x
, который мы уже рассмотрели, - это имя пользователя SSH, которое нужно использовать для входа в систему.
Аргумент-a
указывает, какой атрибут узла использовать в качестве адреса для SSH. По умолчанию это полное доменное имя вашего узла (помните, вы можете найти это с помощью командыknife status
, показанной ранее), поэтому, если вы можете разрешить свои серверы, посетивhttp://fe1.yourdomain.com, вы можете опустить-a
вариант.
Интерактивный нож SSH
knife ssh
также имеет возможность поместить вас в интерактивную оболочку, где вы можете выполнить ряд команд и очень быстро увидеть результаты. Вы можете запустить интерактивную оболочкуknife ssh
, используяinteractive
вместо вашей команды SSH.
knife ssh "role:web_server" interactive -x yourusername -a ipaddress
Это покажет нам:
Connected to 111.111.111.111 and 222.222.222.222
To run a command on a list of servers, do:
on SERVER1 SERVER2 SERVER3; COMMAND
Example: on latte foamy; echo foobar
To exit interactive mode, use 'quit!'
knife-ssh>
Вы можете отдавать команды всем серверам в результатах поиска, просто набрав команду и нажавEnter.
knife-ssh> uptime
111.111.111.111 18:43:55 up 2 days, 21:16, 1 user, load average: 0.01, 0.03, 0.05
222.222.222.222 18:43:49 up 2 days, 21:11, 1 user, load average: 0.00, 0.01, 0.05
Если вы хотите дополнительно уточнить список серверов, просто используйтеon
, как подсказывает справочное сообщение. Обратите внимание, что вам следует заменитьSERVER1 в примере команды на атрибут, который вы использовали как-a
; для нас это IP-адрес узла.
knife-ssh> on 111.111.111.111; echo hello digitalocean
111.111.111.111 hello digitalocean
Одним из действительно интересных способов использования интерактивногоknife ssh
является использование его для отслеживания журналов сервера. Например, если ваш журнал доступа для Nginx находится в местоположении по умолчанию (/var/log/nginx/access.log
), вы можете отслеживать журналы с помощью параметра-f
(follow), и результаты будут постоянно выводиться на вашу консоль.
knife-ssh> tail -f /var/log/nginx/access.log
(В зависимости от того, как настроен Nginx, возможно, вам придется использоватьsudo
перед этой командой.)
Если вы зайдете по IP-адресу одного из ваших узлов в веб-браузере, вы увидите запись в журнале доступа Nginx без каких-либо действий!
Управление узлами с ножевым узлом
Если вы следовали руководствуHow To Create Simple Chef Cookbooks to Manage Infrastructure on Ubuntu, значит, вы уже использовалиknife node
для перечисления всех узлов на вашем сервере Chef и для редактирования атрибутов узлов.
knife node list
knife node edit frontend01
Вы также можете использоватьknife node
для удаления узлов.
knife node delete frontend01
Или показать более подробные атрибуты узла:
knife node show frontend01
*******
Node Name: frontend01
Environment: _default
FQDN: fe01.yourdomain.com
IP: 111.111.111.111
Run List: role[frontend]
Roles: web_server
Recipes: apt, nginx, apt::default, nginx::default
Platform: ubuntu 14.04
Tags:
Вы можете получить полный список атрибутов вашего узла, используя опцию-l
:
knife node show -l frontend01
Это вернет очень длинный список атрибутов, большинство из которых автоматически заполняетсяOhai, который представляет собой инструмент Chef, который автоматически передает атрибутыchef-client
при каждом запуске.
Длинный печатный список атрибутов не обязательно очень полезен для нас. Тем не менее, нож нас тоже прикрыл. Мы можем указать параметр--format
, чтобы получить представление атрибутов узла в формате JSON или YAML.
knife node show frontend01 --format json
*******
{
"name": "frontend01",
"chef_environment": "_default",
"run_list": [
"role[web_server]"
]
,
"normal": {
"tags": [
]
}
}
Вы также можете получить атрибут одного узла с помощью-a
.
knife node show frontend01 --format json -a ipaddress
*******
{
"frontend01": {
"ipaddress": "111.111.111.111"
}
}
Вывод в формате JSON или YAML может быть очень полезен, если мы хотим создать более сложные сценарии, в которых используется нож, или даже для отображения инструментальных панелей и метрик.
Заключение
Нож является мощным инструментом не только для создания и обновления различных объектов в кластере Chef, но также для просмотра и управления состоянием кластера.
С помощьюknife ssh
вы можете написать одну команду и запустить ее на многих узлах одновременно - очень мощный инструмент для любого разработчика DevOps.