Используем Ansible для управления несколькими серверами

Ansible – это современный инструмент управления конфигурацией, который упрощает настройку и обслуживание удаленных серверов. Минималистичный дизайн позволяет быстро включиться в работу, с его помощью можно централизованно управлять сотнями систем – это делается через плейбуки или через специальные команды.

Плейбуки – это файлы, состоящие из наборов задач, которые можно использовать повторно. А специальные команды – это задачи, которые выполняются не так часто (это, например, перезапуск сервиса или извлечение информации об удаленных системах, которыми управляет Ansible).

В этом мануале вы узнаете, как использовать специальные команды Ansible для выполнения типичных задач, таких как установка пакетов, копирование файлов и перезапуск сервисов на одном или нескольких удаленных серверах с управляющей ноды Ansible.

Требования

  • Главная (управляющая) нода Ansible. В этом мануале предполагается, что в этом качестве вы используете компьютер Ubuntu 20.04 с установкой Ansible, который подключается к хостам Ansible с помощью ключей SSH. Также на главной ноде нужен обычный пользователь sudo и включенный брандмауэр, как описано в этом мануале. Чтобы установить Ansible, следуйте этому руководству.
  • Два хоста Ansible (можно больше). Хост Ansible – это любой компьютер, настройками которого может управлять главная нода Ansible. В этом мануале предполагается, что в качестве хостов Ansible вы используете удаленные серверы Ubuntu 20.04. Убедитесь, что на каждом хосте Ansible есть открытый SSH ключ главной ноды Ansible (его нужно добавить в authorized_keys системного пользователя). Для этого можно использовать либо аккаунт root, либо обычного пользователя sudo. За инструкциями обратитесь к разделу 2 этого мануала.
  • Файл инвентаря на главной ноде Ansible, содержащий все хосты Ansible. Чтобы настроить такой файл, обратитесь к мануалу Создание файла инвентаря Ansible. Предварительно протестируйте подключение между главной нодой и хостами

Тестирование подключения хостов Ansible

Следующая команда проверит соединение между главной нодой и всеми хостами Ansible. Эта команда использует текущего системного пользователя и соответствующий ему SSH-ключ в для удаленного входа в систему и включает параметр -m, который сообщает Ansible о необходимости запустить модуль ping. Она также содержит флаг -i, с помощью которого Ansible будет пинговать хосты, перечисленные в указанном файле инвентаря.

Если вы впервые подключаетесь к этим серверам через SSH, вам будет предложено подтвердить подлинность хостов. При появлении запроса введите yes и нажмите Enter.

Вы должны получить примерно такой результат:

server1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
server2 | SUCCESS => {
"changed": false,
"ping": "pong"
}

Если вы получили от хоста ответ «pong», это означает, что соединение установлено, и вы можете выполнять команды Ansible на этом сервере.

Настройка параметров подключения

По умолчанию Ansible пытается подключиться к хостам через удаленного пользователя с тем же именем, что и у вашего текущего системного пользователя, используя соответствующую ему пару ключей SSH.

Чтобы подключиться как другой удаленный пользователь, добавьте команду с флагом –u, после которого укажите имя нужного пользователя:

ansible all -i inventory -m ping -u 8host

Если вы используете пользовательский ключ SSH для подключения к удаленным серверам, вы можете предоставить его во время выполнения с помощью параметра —private-key:

ansible all -i inventory -m ping --private-key=~/.ssh/custom_id

Читайте также: Как работать с Ansible: простая и удобная шпаргалка

После того как вы подключитесь, используя соответствующие параметры, вы сможете настроить файл инвентаря. В нем можно установить другого удаленного пользователя и закрытый ключ, если они не соответствуют значениям Ansible по умолчанию. Тогда вам не нужно будет указывать эти параметры в командной строке.

В следующем примере файла инвентаря переменная ansible_user настроена только для сервера server1:

server1 ansible_host=203.0.113.111 ansible_user=8host
server2 ansible_host=203.0.113.112

Теперь Ansible будет использовать аккаунт 8host в качестве удаленного пользователя по умолчанию при подключении к серверу server1.

Чтобы настроить пользовательский ключ SSH, включите переменную ansible_ssh_private_key_file:

server1 ansible_host=203.0.113.111 ansible_ssh_private_key_file=/home/8host/.ssh/custom_id
server2 ansible_host=203.0.113.112

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

[group_a] 203.0.113.111
203.0.113.112
[group_b] 203.0.113.113
[group_a:vars] ansible_user=8host
ansible_ssh_private_key_file=/home/8host/.ssh/custom_id

В этом примере пользовательские конфигурации (другой аккаунт и ключ SSH) будут применяться только для подключения к серверам группы group_a.

Определение целей для выполнения команд

При выполнении специальных команд Ansible вы можете настроить целевые хосты, а также любую комбинацию групп, хостов и подгрупп. Например, вот как можно проверить подключение каждого хоста в группе servers:

ansible servers -i inventory -m ping

Вы также можете указать несколько хостов и групп, разделив их двоеточиями:

ansible server1:server2:dbservers -i inventory -m ping

Чтобы добавить в шаблон исключение, используйте восклицательный знак, поставив перед ним escape-символ \, как показано ниже. Эта команда будет запущена на всех серверах из группы group1, кроме server2:

ansible group1:\!server2 -i inventory -m ping

Если вам нужно запустить команду только на серверах, которые входят и в group1, и group2, вам следует использовать символ &. Не забудьте поставить перед ним обратный слеш:

ansible group1:\&group2 -i inventory -m ping

За дополнительной информацией о том, как использовать шаблоны при определении целей для команд, обратитесь к разделу 5 мануала Создание файла инвентаря Ansible.

Запуск модулей Ansible

Модули Ansible – это фрагменты кода, которые можно вызывать из плейбука, а также из командной строки для упрощения выполнения процедур на удаленных нодах. Например, модуль apt используется для управления системными пакетами в Ubuntu, а модуль user – для управления пользователями системы. Команда ping, которую мы уже использовали в этом мануале, также является модулем, обычно он применяется для проверки соединения между главной нодой и хостами.

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

Чтобы выполнить модуль с аргументами, добавьте в команду флаг -a, а затем соответствующие параметры в двойных кавычках:

ansible target -i inventory -m module -a "module options"

В качестве примера мы используем модуль apt для установки пакета tree на server1:

ansible server1 -i inventory -m apt -a "name=tree"

Запуск команд Bash

Если модуль не указан с помощью опции -m, для выполнения указанной команды на удаленном сервере по умолчанию используется модуль command.

Это позволяет выполнить практически любую команду, которую обычно можно запустить через терминал SSH (при условии, что подключающийся пользователь имеет достаточные права, а команда не использует интерактивные запросы).

В этом примере команда uptime выполняется на всех серверах из указанного инвентаря:

ansible all -i inventory -a "uptime"
server1 | CHANGED | rc=0 >>
14:12:18 up 55 days,  2:15,  1 user,  load average: 0.03, 0.01, 0.00
server2 | CHANGED | rc=0 >>
14:12:19 up 10 days,  6:38,  1 user,  load average: 0.01, 0.02, 0.00

Повышение привилегий для выполнения команд с помощью sudo

Если команда или модуль, которые вы хотите выполнить на удаленных хостах, требуют расширенных системных привилегий или другого пользователя, вам нужно использовать модуль повышения привилегий Ansible, become. Этот модуль –  абстракция для sudo, а также для других программ для повышения привилегий, поддерживаемых Ansible в разных ОС.

Например, вам нужно включить параметр –become, если вы хотите запустить команду tail для вывода последних сообщений из лога ошибок Nginx на server1 из инвентаря:

ansible server1 -i inventory -a "tail /var/log/nginx/error.log" --become

Это эквивалентно запуску команды sudo tail /var/log/nginx/error.log на удаленном хосте с помощью текущего пользователя локальной системы или удаленного пользователя, указанного в инвентаре.

Системы повышения привилегий, такие как sudo, часто требуют, чтобы вы подтвердили свои учетные данные. Для этого они предлагают ввести пароль. Но это может привести к тому, что Ansible не сможет выполнить команду или плейбук. Потому вы можете использовать параметр –ask-become-pass или -K, чтобы Ansible запросил у вас пароль sudo:

ansible server1 -i inventory -a "tail /var/log/nginx/error.log" --become -K

Установка и удаление пакетов

В следующем примере модуль apt используется для установки пакета nginx на все хосты из текущего инвентаря:

ansible all -i inventory -m apt -a "name=nginx" --become -K

Чтобы удалить пакет, включите в команду аргумент state и присвойте ему значение absent.

ansible all -i inventory -m apt -a "name=nginx state=absent" --become  -K

Копирование файлов

С помощью модуля file вы можете копировать файлы между главной нодой и управляемыми хостами в любом направлении. Следующая команда копирует локальный текстовый файл на все удаленные хосты:

ansible all -i inventory -m copy -a "src=./file.txt dest=~/myfile.txt"

Чтобы скопировать файл с удаленного сервера на главную ноду, включите опцию remote_src:

ansible all -i inventory -m copy -a "src=~/myfile.txt remote_src=yes dest=./file.txt"

Изменение прав доступа к файлу

Чтобы изменить права доступа к файлам и каталогам на удаленных нодах, вы можете использовать модуль file.

Следующая команда настроит права для файла file.txt, расположенного в /var/www на удаленном хосте. Она установит umask файла на 600, вследствие чего чтение и запись будут доступны только текущему владельцу файла. Кроме того, команда установит право собственности на этот файл для пользователя и группы по имени 8host:

ansible all -i inventory -m file -a "dest=/var/www/file.txt mode=600 owner=8host group=8host" --become  -K

Поскольку файл находится в каталоге, который обычно принадлежит пользователю root, нам могут потребоваться привилегии sudo для изменения его свойств. Вот почему мы добавили параметры –become и -K. Они запустят систему повышения привилегий Ansible для запуска команды с расширенными привилегиями, благодаря чему вам будет предложено ввести пароль sudo.

Перезапуск сервисов

Вы можете использовать модуль service для управления сервисами, работающими на удаленных хостах Ansible. Для этого потребуются расширенные системные привилегии, поэтому убедитесь, что у вашего удаленного пользователя есть доступ к sudo и вы включили параметр –become, чтобы использовать систему повышения привилегий Ansible. Флаг -K предложит вам ввести пароль sudo.

Чтобы перезапустить сервис nginx на всех хостах в группе webservers, запустите такую команду:

ansible webservers -i inventory -m service -a "name=nginx state=restarted" --become  -K

Перезагрузка серверов

В Ansible нет специального модуля для перезагрузки серверов, но вы можете выполнить команду bash, которая вызывает команду /sbin/reboot на удаленном хосте.

Для перезапуска сервера потребуются расширенные системные привилегии, поэтому убедитесь, что у вашего удаленного пользователя есть доступ к sudo и вы включили параметр –become. Флаг -K предложит вам ввести пароль sudo вашего пользователя.

Важно! Следующая команда полностью перезапустит сервер или серверы, которыми управляет Ansible. Это может вызвать временный сбой в работе всех приложений, использующих эти серверы.

Например, чтобы перезапустить все серверы в группе webservers, запустите такую команду:

ansible webservers -i inventory -a "/sbin/reboot"  --become  -K

Сбор информации об удаленных нодах

Модуль setup возвращает подробную информацию (системные данные) об удаленных системах под управлением Ansible.

Чтобы получить системные данные server1, введите:

ansible server1 -i inventory -m setup

Эта команда выведет большой объем данных JSON, содержащих сведения об удаленной серверной среде. Чтобы вывести только самую важную информацию, добавьте аргумент “gather_subset=min”:

ansible server1 -i inventory -m setup -a "gather_subset=min"

Чтобы вывести только определенные элементы JSON, вы можете использовать аргумент filter. Он принимает подстановочный шаблон для сравнения строк и поиска совпадений, аналогично fnmatch. Например, чтобы получить информацию о сетевых интерфейсах ipv4 и ipv6, вы можете использовать *ipv* в качестве фильтра:

ansible server1 -i inventory -m setup -a "filter=*ipv*"
server1 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"203.0.113.111",
"10.0.0.1"
],
"ansible_all_ipv6_addresses": [
"fe80::a4f5:16ff:fe75:e758"
],
"ansible_default_ipv4": {
"address": "203.0.113.111",
"alias": "eth0",
"broadcast": "203.0.113.111",
"gateway": "203.0.113.1",
"interface": "eth0",
"macaddress": "a6:f5:16:75:e7:58",
"mtu": 1500,
"netmask": "255.255.240.0",
"network": "203.0.113.0",
"type": "ether"
},
"ansible_default_ipv6": {}
},
"changed": false
}

Если вы хотите проверить использование диска, вы можете запустить команду Bash, вызывающую утилиту df:

ansible all -i inventory -a "df -h"
server1 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            3.9G     0  3.9G   0% /dev
tmpfs           798M  624K  798M   1% /run
/dev/vda1       155G  2.3G  153G   2% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/vda15      105M  3.6M  101M   4% /boot/efi
tmpfs           798M     0  798M   0% /run/user/0
server2 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           395M  608K  394M   1% /run
/dev/vda1        78G  2.2G   76G   3% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/vda15      105M  3.6M  101M   4% /boot/efi
tmpfs           395M     0  395M   0% /run/user/0

Заключение

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

За дополнительной информацией обращайтесь к официальной документации Ansible по специальным командам.

Tags:

Добавить комментарий