Вспомним команду:
ansible all -i inventory.ini -u root -m ping
all — зарезервированное ключевое слово в Ansible. Оно обозначает, что команду нужно выполнить для всех серверов, указанных в inventory-файле. Такой способ хорошо работает, когда серверы имеют одинаковую роль, например на них разворачивается код приложения и они обрабатывают входящие запросы. В более сложных ситуациях, серверы выполняют разные роли, где-то запущена база данных, где-то раздается статика (картинки, шрифты и т.п.), где-то выполняются тяжелые асинхронные обработчики. И для такой инфраструктуры требуется разделение из-за различий в настройке. В одном месте нужна база данных, в другом нет. Для решения этой задачи Ansible вводит понятие групп серверов. Пример inventory-файла с двумя группами:
# Имена групп выбраны произвольно
# Количество серверов в группе может быть любым
[webservers]
ec2-3-17-186-111.us-east-2.compute.amazonaws.com
ec2-3-20-186-111.us-east-2.compute.amazonaws.com
[appservers]
157.230.82.133
Выполним команду на одной из наших групп:
ansible appservers -i inventory.ini -a 'uptime'
# Группа appservers состоит из одного сервера
157.230.82.133 | CHANGED | rc=0 >>
06:12:48 up 11 days, 21:53, 1 user, load average: 0.04, 0.04, 0.01
А при указании группы webservers, команда uptime
будет выполнена на двух серверах
ansible webservers -i inventory.ini -a 'uptime'
ec2-3-17-186-111.us-east-2.compute.amazonaws.com | CHANGED | rc=0 >>
06:12:48 up 11 days, 21:53, 1 user, load average: 0.04, 0.04, 0.01
ec2-3-20-186-111.us-east-2.compute.amazonaws.com | CHANGED | rc=0 >>
06:12:48 up 11 days, 21:53, 1 user, load average: 0.04, 0.04, 0.01
Настройки серверов
По умолчанию ssh находится на 22 порту, но иногда его меняют в целях безопасности. Тогда его нужно явно прописать:
[webservers]
ec2-52-17-124-244.eu-west:8081
Если у сервера есть IP, но нет доменного имени, его можно задать с помощью специального параметра ansible_host
:
# Выбираем удобное имя
jumper ansible_host=123.25.26.35
Такое имя можно использовать в командах Ansible. Это позволит, например, с помощью специального флага --limit
выполнять запросы на конкретном сервере:
ansible all --limit jumper -i inventory.ini -m ping
В файле инвентаризации можно настроить различные группировки. Сейчас у нас есть группы [webservers]
и [appservers]
. Они запускаются и стартуют по-разному, но мы можем объединить их в общую группу с помощью опции children
. Пример такого объединения под общим именем servers
:
[servers:children]
webservers
appservers
[webservers]
ec2-52-17-124-244.eu-west:8081
[appservers]
ec2-52-17-124-245.eu-west
Это позволит выполнять запросы сразу к двум группам серверов:
ansible servers -i inventory.ini -m ping
Ansible позволяет работать и на текущем компьютере пользователя. Для локального соединения создается отдельная запись localhost
с указанием того, что это локальная машина. Тогда Ansible пропускает соединение по ssh и выполняет команды напрямую:
localhost ansible_connection=local
localhost
не входит ни в какую группу, поэтому для выполнения команды понадобится опция --limit
, которая ограничивает запуск конкретной машиной:
ansible all --limit localhost -i inventory.ini -u root -m ping
Самостоятельная работа
Создайте два сервера в облаке (всего должно быть два сервера) и повторите шаги из теории, используя свои алиасы для серверов и их IP-адреса
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.