Управление несколькими инвентарями Ansible

AnsibleBeginner
Практиковаться сейчас

Введение

В этом практическом занятии (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.

Разберем этот плейбук, чтобы понять каждую его часть:

  1. --- в начале файла указывает на начало документа в формате YAML.
  2. name: Demonstrate multi-environment playbook - это описательное имя для этого сценария выполнения (play).
  3. hosts: all означает, что этот плейбук будет выполняться на всех хостах в инвентаре.
  4. gather_facts: no пропускает фазу сборки фактов (fact-gathering), чтобы ускорить выполнение. Сбор фактов - это процесс, при котором Ansible собирает информацию о целевых хостах.
  5. tasks: начинает список задач, которые должны быть выполнены.
  6. Первая задача использует модуль debug для вывода сообщения. Она использует условный оператор, чтобы определить, находится ли хост в среде производства или разработки:
    • group_names - это специальная переменная, которая содержит список всех групп, к которым принадлежит текущий хост.
    • Если 'prod' находится в списке group_names, выводится "production", в противном случае - "development".
  7. Вторая задача запускает команду hostname и сохраняет ее вывод в переменную с именем hostname_output.
  8. Третья задача выводит имя хоста с использованием модуля 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

Этот вывод показывает, что:

  1. Плейбук успешно запустился в среде разработки.
  2. Он правильно определил, что хост принадлежит среде разработки.
  3. Он успешно извлек и отобразил имя хоста.
  4. "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. Вы создали отдельные файлы инвентарей для сред разработки и производства, написали плейбук, который может работать в обеих средах, и запустили этот плейбук с использованием различных конфигураций инвентарей.

Основные выводы из этого практического занятия:

  1. Создание и организация нескольких файлов инвентарей: Вы научились создавать отдельные файлы инвентарей для разных сред, что помогает в организации и управлении хостами.
  2. Написание плейбуков, адаптируемых к разным средам: Вы создали плейбук, который проверяет, в какой среде он запускается, и соответствующим образом изменяет свое поведение.
  3. Запуск плейбуков с одним или несколькими инвентарями: Вы научились указывать один или несколько файлов инвентарей при запуске плейбука, что позволяет гибко выбирать целевые хосты.
  4. Понимание того, как Ansible обрабатывает хосты, которые встречаются в нескольких инвентарях: Вы увидели, что Ansible удаляет дубликаты хостов и использует последнее вхождение хоста при определении принадлежности к группе.

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