Создание статических инвентарей с группами и переменными

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

Введение

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

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

Создание проекта инвентаризации

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

Создайте проект и перейдите в него.

cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,inventory/host_vars,playbooks,reports}
cd rhce-ansible

Создайте файл ansible.cfg, чтобы Ansible по умолчанию использовал ваш инвентарь.

cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
retry_files_enabled = False
interpreter_python = auto_silent
EOF

В этой лабораторной работе файлы переменных размещаются в inventory/group_vars и inventory/host_vars. Такая структура позволяет хранить данные инвентаря вместе и делает очевидным, что переменные относятся к хостам, определенным в inventory/hosts.

Определение хостов, групп и дочерних элементов

На этом этапе вы создадите статический инвентарь. Каждый псевдоним хоста использует ansible_connection=local, поэтому псевдонимы ведут себя как управляемые хосты, хотя команды выполняются на этой же виртуальной машине. Дочерние группы позволяют одной группе содержать в себе другие группы.

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

cd /home/labex/project/rhce-ansible

Создайте файл inventory/hosts.

cat > inventory/hosts <<'EOF'
[web]
web1 ansible_connection=local
web2 ansible_connection=local

[db]
db1 ansible_connection=local

[prod:children]
web
db
EOF

Просмотрите граф групп.

ansible-inventory --graph

Секции web и db определяют обычные группы. Секция [prod:children] определяет родительскую группу, поэтому на графе должно быть видно, что prod содержит обе группы и все три псевдонима хостов.

Добавление групповых переменных и переменных хостов

На этом этапе вы привяжете переменные к группам и отдельным хостам. Групповая переменная применяется ко всем хостам в этой группе. Переменная хоста переопределяет или дополняет значения для конкретного хоста.

Перед выполнением команд на этом этапе вернитесь в директорию проекта Ansible.

cd /home/labex/project/rhce-ansible

Создайте переменные для веб-хостов.

cat > inventory/group_vars/web.yml <<'EOF'
service_role: web
service_port: 8080
EOF

Эти значения применяются к каждому хосту в группе web. В данном инвентаре и web1, и web2 должны унаследовать роль и порт веб-сервиса.

Создайте переменные для хостов баз данных.

cat > inventory/group_vars/db.yml <<'EOF'
service_role: database
service_port: 5432
EOF

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

Создайте специфичную для хоста переменную для web2.

cat > inventory/host_vars/web2.yml <<'EOF'
rack: rack-b
EOF

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

Проверка разрешенных переменных хостов

На этом этапе вы попросите Ansible показать разрешенные (итоговые) переменные для выбранных хостов. Это безопасный способ отладки инвентаря перед написанием плейбуков.

Перед выполнением команд на этом этапе вернитесь в директорию проекта Ansible.

cd /home/labex/project/rhce-ansible

Проверьте web1.

ansible-inventory --host web1

Для web1 должны отобразиться роль и порт веб-сервиса, но переменная rack должна отсутствовать. Это отсутствие является полезным доказательством того, что файл для конкретного хоста web2 не был ошибочно применен ко всей группе.

Проверьте web2 и найдите специфичное для хоста значение rack.

ansible-inventory --host web2 | grep -E 'service_role|service_port|rack'

Проверьте db1.

ansible-inventory --host db1 | grep -E 'service_role|service_port'

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

Написание плейбука для отчета по переменным

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

Перед выполнением команд на этом этапе вернитесь в директорию проекта Ansible.

cd /home/labex/project/rhce-ansible

Создайте плейбук.

cat > playbooks/write-inventory-report.yml <<'EOF'
---
- name: Write inventory variable reports
  hosts: prod
  gather_facts: false
  tasks:
    - name: Write report for each inventory host
      ansible.builtin.copy:
        dest: "/home/labex/project/rhce-ansible/reports/{{ inventory_hostname }}.txt"
        content: "{{ inventory_hostname }} role={{ service_role }} port={{ service_port }} rack={{ rack | default('none') }}\n"
        mode: '0644'
EOF

Выражение {{ inventory_hostname }} раскрывается в текущий псевдоним хоста, поэтому одна задача может создать отдельные файлы отчетов для web1, web2 и db1. Фильтр default('none') предотвращает ошибку на хостах, где переменная rack не определена.

Запустите плейбук и проверьте отчеты.

ansible-playbook playbooks/write-inventory-report.yml

Плейбук нацелен на группу prod, которая является родительской группой, содержащей как веб-хосты, так и хосты баз данных. Сводка (recap) должна включать все три псевдонима и завершиться с failed=0.

cat reports/*.txt

Файлы отчетов являются окончательным доказательством того, что переменные инвентаря разрешились правильно. web2.txt должен содержать rack-b, в то время как остальные хосты должны показывать rack=none.

Резюме

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