Создание файла инвентаря Ansible

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

Существует несколько способов настройки этого файла Ansible (в зависимости от вашей среды и потребностей проекта). В этом мануале мы покажем, как создавать файлы инвентаря и организовывать серверы в группы и подгруппы, как настраивать переменные хоста и использовать шаблоны для управления командами и сценариями Ansible для каждого хоста и каждой группы.

Требования

  • Одна главная нода Ansible: машина Ubuntu 20.04 с установкой Ansible, настроенной для подключения к вашим хостам Ansible по ключам SSH. Убедитесь, что на главной ноде есть обычный пользователь sudo и включен брандмауэр, как описано в мануале по начальной настройке сервера. Чтобы настроить Ansible, следуйте этому мануалу.
  • Два хоста Ansible (можно больше): это удаленные серверы Ubuntu 20.04.

1: Создание пользовательского инвентаря

После установки Ansible создает файл инвентаря, который обычно находится в /etc/ansible/hosts. Это расположение по умолчанию Ansible использует, если у него нет пользовательского файла инвентаря, который предоставляется с помощью параметра -i во время выполнения плейбука или команды.

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

Для начала войдите в домашний каталог и создайте новый каталог для хранения ваших файлов Ansible:

cd ~
mkdir ansible

Перейдите в него и откройте новый файл инвентаря в текстовом редакторе:

cd ansible
nano inventory

Для создания рабочего файла инвентаря достаточно поместить в него список ваших хостов (каждый новый хост – с новой строки). Имена хостов и IP-адреса взаимозаменяемы:

203.0.113.111
203.0.113.112
203.0.113.113
server_hostname

После настройки инвентаря вы можете использовать команду ansible-inventory для проверки и получения информации о вашем инвентаре Ansible:

ansible-inventory -i inventory --list
{
"_meta": {
"hostvars": {}
},
"all": {
"children": [
"ungrouped"
]
},
"ungrouped": {
"hosts": [
"203.0.113.111",
"203.0.113.112",
"203.0.113.113",
"server_hostname"
]
}
}

Пока что мы не создали никаких групп в нашем инвентаре, но вывод показывает две отдельные группы, которые Ansible выдает автоматически: all и ungrouped. Как следует из названия, группа all используется для ссылки на все серверы из инвентаря, независимо от того, как они организованы. Группа ungrouped используется для ссылки на серверы, которые не входят в какую-либо группу.

Запуск команд и плейбуков с пользовательским инвентарем

Чтобы запускать команды Ansible с пользовательским инвентарем, используйте параметр -i:

ansible all -i inventory -m ping

Это запустит модуль ping на всех хостах, перечисленных в вашем файле инвентаря.

Точно так же можно запустить сценарии Ansible:

ansible-playbook -i inventory playbook.yml

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

Итак, мы создали базовый инвентарь и попробовали использовать его для выполнения команд и сценариев. Теперь давайте объединим хосты в группы и подгруппы.

2: Объединение хостов в группы и подгруппы

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

Один хост может входить в несколько групп. Следующий файл инвентаря в формате INI демонстрирует настройку с четырьмя группами: webservers, dbservers, development и production. Обратите внимание, что серверы сгруппированы по двум разным характеристикам: их назначение (интернет и база данных) и среда их использования (разработка и производство).

[webservers]
203.0.113.111
203.0.113.112
[dbservers]
203.0.113.113
server_hostname
[development]
203.0.113.111
203.0.113.113
[production]
203.0.113.112
server_hostname

Если запустить этот инвентарь с помощью ansible-inventory, вы получите:

{
"_meta": {
"hostvars": {}
},
"all": {
"children": [
"dbservers",
"development",
"production",
"ungrouped",
"webservers"
]
},
"dbservers": {
"hosts": [
"203.0.113.113",
"server_hostname"
]
},
"development": {
"hosts": [
"203.0.113.111",
"203.0.113.113"
]
},
"production": {
"hosts": [
"203.0.113.112",
"server_hostname"
]
},
"webservers": {
"hosts": [
"203.0.113.111",
"203.0.113.112"
]
}
}

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

[web_dev]
203.0.113.111
[web_prod]
203.0.113.112
[db_dev]
203.0.113.113
[db_prod]
server_hostname
[webservers:children]
web_dev
web_prod
[dbservers:children]
db_dev
db_prod
[development:children]
web_dev
db_dev
[production:children]
web_prod
db_prod

Чем больше у вас серверов, тем больше смысла имеет деление их на группы или метагруппы.

3: Настройка псевдонимов

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

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

server1 ansible_host=203.0.113.111
server2 ansible_host=203.0.113.112
server3 ansible_host=203.0.113.113
server4 ansible_host=server_hostname

Если бы вы запустили команду ansible-inventory с этим инвентарем, вы бы увидели примерно такой результат:

{
"_meta": {
"hostvars": {
"server1": {
"ansible_host": "203.0.113.111"
},
"server2": {
"ansible_host": "203.0.113.112"
},
"server3": {
"ansible_host": "203.0.113.113"
},
"server4": {
"ansible_host": "server_hostname"
}
}
},
"all": {
"children": [
"ungrouped"
]
},
"ungrouped": {
"hosts": [
"server1",
"server2",
"server3",
"server4"
]
}
}

Обратите внимание, теперь на серверы ссылаются их псевдонимы, а не IP-адреса или имена хостов. Так проще ссылаться на отдельные серверы при выполнении команд и плейбуков.

4: Настройка переменных хоста

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

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

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

server1 ansible_host=203.0.113.111 ansible_user=8host
server2 ansible_host=203.0.113.112 ansible_user=8host
server3 ansible_host=203.0.113.113 ansible_user=myuser
server4 ansible_host=server_hostname ansible_user=myuser

Вы объединить хосты с одинаковыми настройками в одну группу, а затем настроить их переменные на уровне группы:

[group_a]
server1 ansible_host=203.0.113.111
server2 ansible_host=203.0.113.112
[group_b]
server3 ansible_host=203.0.113.113
server4 ansible_host=server_hostname
[group_a:vars]
ansible_user=8host
[group_b:vars]
ansible_user=myuser

Команда ansible-inventory, запущенная с таким инвентарем, выдаст следующий результат:

{
"_meta": {
"hostvars": {
"server1": {
"ansible_host": "203.0.113.111",
"ansible_user": "8host"
},
"server2": {
"ansible_host": "203.0.113.112",
"ansible_user": "8host"
},
"server3": {
"ansible_host": "203.0.113.113",
"ansible_user": "myuser"
},
"server4": {
"ansible_host": "server_hostname",
"ansible_user": "myuser"
}
}
},
"all": {
"children": [
"group_a",
"group_b",
"ungrouped"
]
},
"group_a": {
"hosts": [
"server1",
"server2"
]
},
"group_b": {
"hosts": [
"server3",
"server4"
]
}
}

Обратите внимание, все переменные инвентаря перечислены в ноде _meta.

5: Использование шаблонов для запуска команд и плейбуков

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

Давайте рассмотрим следующий файл инвентаря:

[webservers]
203.0.113.111
203.0.113.112
[dbservers]
203.0.113.113
server_hostname
[development]
203.0.113.111
203.0.113.113
[production]
203.0.113.112
server_hostname

Теперь представьте, что вам нужно выполнить команду, нацеленную только на сервер(ы) базы данных, которые работают в производственной среде. В этом примере этому критерию соответствует только server_hostname; однако легко предположить, что в этой группе может оказаться гораздо больше серверов баз данных. Чтобы не настраивать индивидуальный таргетинг на каждый сервер, вы можете использовать следующий шаблон:

ansible dbservers:&production -m ping

Этот шаблон будет нацелен на серверы, которые присутствуют и в группе dbservers, и в production одновременно. Если же вы хотите нацелить шаблон на серверы, которые состоят только в группе dbservers, исключив группу production, —  вы должны вместо этого использовать следующий шаблон:

ansible dbservers:!production -m ping

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

Шаблон цель
all Все хосты из указанного инвентаря
host1 Единственный хост (host1)
host1:host2 Оба хоста, host1 и host2
group1 Единственная группа (group1)
group1:group2 Все серверы в группах group1 и group2
group1:&group2 Cерверы, которые состоят и в группе group1, и в group2
group1:!group2 Серверы, которые состоят только в group1, исключая те, что состоят одновременно в группе group2

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

Заключение

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

Tags: ,

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