Как управлять кластером с шеф-поваром и ножом в Ubuntu

Вступление

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.

Related