Введение
В этом практическом занятии (lab) вы узнаете, как работать с несколькими инвентарями в Ansible. Управление несколькими инвентарями - это распространенная ситуация в сложных средах с разными группами хостов или отдельными окружениями. Вы научитесь определять и организовывать несколько инвентарей, получать доступ к хостам из разных инвентарей и выполнять операции с несколькими инвентарями.
Создание директории и файлов инвентаризации
Начнем с создания директории для хранения наших файлов инвентаря, а затем создадим два отдельных файла инвентаря для сред разработки и производства.
Сначала создайте новую директорию с именем inventory в пути /home/labex/project:
mkdir -p /home/labex/project/inventory
Эта команда создает новую директорию с именем inventory. Опция -p гарантирует, что родительские директории будут созданы, если они не существуют.
Теперь создайте два файла инвентаря: dev_inventory.ini и prod_inventory.ini внутри директории inventory:
touch /home/labex/project/inventory/dev_inventory.ini
touch /home/labex/project/inventory/prod_inventory.ini
Команда touch создает пустые файлы, если они не существуют, или обновляет время модификации, если они уже существуют.
Далее мы добавим содержимое в эти файлы инвентаря. Откройте dev_inventory.ini в текстовом редакторе (вы можете использовать nano или любой другой удобный вам текстовый редактор):
nano /home/labex/project/inventory/dev_inventory.ini
Добавьте следующее содержимое:
[dev]
localhost ansible_connection=local
Сохраните файл и выйдите из редактора (в nano вы можете сделать это, нажав Ctrl+X, затем Y, а затем Enter).
Теперь откройте prod_inventory.ini:
nano /home/labex/project/inventory/prod_inventory.ini
Добавьте следующее содержимое:
[prod]
localhost ansible_connection=local
Сохраните и выйдите из редактора.
В этих файлах инвентаря:
[dev]и[prod]- это имена групп. Они помогают организовать хосты в логические группы.localhost- это имя хоста. Мы используем localhost для имитации разных окружений на одной машине.ansible_connection=localсообщает Ansible запускать команды локально, вместо попытки подключиться к машине по SSH. Это полезно для запуска Ansible на той же машине, на которой он установлен.
В реальной ситуации обычно используются разные IP-адреса или имена хостов для серверов разработки и производства, вместо использования localhost для обоих.
Создание плейбука для нескольких инвентарей
На этом шаге мы создадим плейбук, который сможет работать с нашими инвентарями для разработки и производства. В Ansible плейбук - это файл в формате YAML, который определяет набор задач, которые должны быть выполнены на хостах.
Сначала создадим новый файл с именем multi_env_playbook.yaml в директории /home/labex/project:
touch /home/labex/project/multi_env_playbook.yaml
Теперь откроем файл multi_env_playbook.yaml в текстовом редакторе. Мы будем использовать nano, простой текстовый редактор командной строки:
nano /home/labex/project/multi_env_playbook.yaml
Скопируйте и вставьте следующее содержимое в файл:
---
- name: Demonstrate multi-environment playbook
hosts: all
gather_facts: no
tasks:
- name: Print environment type
debug:
msg: "This host belongs to the {{ 'production' if 'prod' in group_names else 'development' }} environment"
- name: Show hostname
command: hostname
register: hostname_output
- name: Display hostname
debug:
msg: "The hostname is: {{ hostname_output.stdout }}"
После вставки нажмите Ctrl + X, затем Y, а затем Enter, чтобы сохранить изменения и выйти из nano.
Разберем этот плейбук, чтобы понять каждую его часть:
---в начале файла указывает на начало документа в формате YAML.name: Demonstrate multi-environment playbook- это описательное имя для этого сценария выполнения (play).hosts: allозначает, что этот плейбук будет выполняться на всех хостах в инвентаре.gather_facts: noпропускает фазу сборки фактов (fact-gathering), чтобы ускорить выполнение. Сбор фактов - это процесс, при котором Ansible собирает информацию о целевых хостах.tasks:начинает список задач, которые должны быть выполнены.- Первая задача использует модуль
debugдля вывода сообщения. Она использует условный оператор, чтобы определить, находится ли хост в среде производства или разработки:group_names- это специальная переменная, которая содержит список всех групп, к которым принадлежит текущий хост.- Если 'prod' находится в списке
group_names, выводится "production", в противном случае - "development".
- Вторая задача запускает команду
hostnameи сохраняет ее вывод в переменную с именемhostname_output. - Третья задача выводит имя хоста с использованием модуля
debug. Она обращается к сохраненному выводу с помощьюhostname_output.stdout.
Запуск плейбука с использованием инвентаря разработки
Теперь, когда у нас есть настроенный плейбук и инвентари, давайте запустим плейбук, используя инвентарь разработки.
Выполните следующую команду в терминале:
ansible-playbook -i /home/labex/project/inventory/dev_inventory.ini /home/labex/project/multi_env_playbook.yaml
Разберем эту команду:
ansible-playbook- это команда для запуска плейбука Ansible.-i /home/labex/project/inventory/dev_inventory.iniуказывает на файл инвентаря, который нужно использовать. Опция-iозначает "инвентарь" (inventory)./home/labex/project/multi_env_playbook.yaml- это путь к нашему файлу плейбука.
Эта команда сообщает Ansible использовать файл dev_inventory.ini и запустить плейбук multi_env_playbook.yaml.
Вы должны увидеть вывод, похожий на следующий:
PLAY [Demonstrate multi-environment playbook] *******************************************
TASK [Print environment type] *********************************************************
ok: [localhost] => {
"msg": "This host belongs to the development environment"
}
TASK [Show hostname] ******************************************************************
changed: [localhost]
TASK [Display hostname] ***************************************************************
ok: [localhost] => {
"msg": "The hostname is: 66d80191e483433f91fbdca9"
}
PLAY RECAP ****************************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Этот вывод показывает, что:
- Плейбук успешно запустился в среде разработки.
- Он правильно определил, что хост принадлежит среде разработки.
- Он успешно извлек и отобразил имя хоста.
- "PLAY RECAP" показывает сводку по выполнению плейбука. Здесь "ok=3" означает, что три задачи были успешно выполнены, а "changed=1" означает, что одна задача внесла изменения в систему (запуск команды
hostname).
Запуск плейбука с использованием инвентаря производства
Теперь давайте запустим тот же плейбук, используя инвентарь производства, чтобы увидеть, как он ведет себя по-разному.
Выполните следующую команду в терминале:
ansible-playbook -i /home/labex/project/inventory/prod_inventory.ini /home/labex/project/multi_env_playbook.yaml
Эта команда похожа на предыдущую, но использует файл prod_inventory.ini вместо dev_inventory.ini.
Вы должны увидеть вывод, похожий на следующий:
PLAY [Demonstrate multi-environment playbook] *********************************
TASK [Print environment type] *************************************************
ok: [localhost] => {
"msg": "This host belongs to the production environment"
}
TASK [Show hostname] **********************************************************
changed: [localhost]
TASK [Display hostname] *******************************************************
ok: [localhost] => {
"msg": "The hostname is: labex-instance"
}
PLAY RECAP ********************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Обратите внимание, что на этот раз плейбук правильно определяет, что он запускается в среде производства. Это происходит потому, что мы используем файл инвентаря производства, который определяет хост в группе [prod].
Остальной вывод похож на то, что мы видели при использовании инвентаря разработки, что ожидаемо, так как мы все еще запускаем на той же локальной машине.
Запуск Playbook с использованием обоих инвентарных файлов
Наконец, давайте запустим playbook, используя оба инвентарных файла одновременно. Это демонстрирует, как Ansible может работать с несколькими инвентарными файлами одновременно.
Выполните следующую команду в вашем терминале:
ansible-playbook -i /home/labex/project/inventory/dev_inventory.ini -i /home/labex/project/inventory/prod_inventory.ini /home/labex/project/multi_env_playbook.yaml
Эта команда включает оба инвентарных файла, используя несколько опций -i. Ansible объединит эти инвентарные файлы при запуске playbook.
Вы должны увидеть вывод, похожий на следующий:
PLAY [Demonstrate multi-environment playbook] *******************************************************************************************************************************************************************************************************************************************
TASK [Print environment type] ***********************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": "This host belongs to the production environment"
}
TASK [Show hostname] ********************************************************************************************************************************************************************************************************************************************************************
changed: [localhost]
TASK [Display hostname] *****************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": "The hostname is: 66d80191e483433f91fbdca9"
}
PLAY RECAP ******************************************************************************************************************************************************************************************************************************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Вы можете заметить, что, несмотря на то, что мы включили оба инвентарных файла, playbook выполнился только один раз. Это связано с тем, что оба инвентарных файла ссылаются на один и тот же localhost, а Ansible по умолчанию удаляет дубликаты хостов. Если бы в каждом инвентарном файле были разные хосты, Ansible выполнил бы playbook для каждого уникального хоста.
Среда идентифицируется как "production", потому что когда один и тот же хост появляется в нескольких инвентарных файлах с разными группами, Ansible добавляет хост во все группы, к которым он принадлежит. Поскольку localhost определен как в группе [dev], так и в группе [prod], переменная group_names содержит обе группы ('dev' и 'prod'). Логика playbook проверяет, находится ли 'prod' в group_names, что в данном случае всегда будет истинным, поэтому выводится "production" независимо от порядка инвентарных файлов.
Этот подход использования нескольких инвентарных файлов может быть очень полезен в реальных сценариях, когда у вас могут быть общие хосты в разных средах, или когда вы хотите запустить playbook против комбинации хостов из разных инвентарных файлов.
Резюме
В этом практическом занятии вы научились управлять несколькими инвентарями Ansible. Вы создали отдельные файлы инвентарей для сред разработки и производства, написали плейбук, который может работать в обеих средах, и запустили этот плейбук с использованием различных конфигураций инвентарей.
Основные выводы из этого практического занятия:
- Создание и организация нескольких файлов инвентарей: Вы научились создавать отдельные файлы инвентарей для разных сред, что помогает в организации и управлении хостами.
- Написание плейбуков, адаптируемых к разным средам: Вы создали плейбук, который проверяет, в какой среде он запускается, и соответствующим образом изменяет свое поведение.
- Запуск плейбуков с одним или несколькими инвентарями: Вы научились указывать один или несколько файлов инвентарей при запуске плейбука, что позволяет гибко выбирать целевые хосты.
- Понимание того, как Ansible обрабатывает хосты, которые встречаются в нескольких инвентарях: Вы увидели, что Ansible удаляет дубликаты хостов и использует последнее вхождение хоста при определении принадлежности к группе.
Эти навыки являются важными при управлении сложными инфраструктурами с различными средами. Используя несколько инвентарей, вы можете лучше организовать и контролировать автоматизацию с использованием Ansible на разных наборах хостов или в разных средах.


