Введение
Переменные позволяют хранить данные отдельно от логики задач. Переменные групп предоставляют общие значения, переменные хостов позволяют переопределять настройки для отдельных узлов, а факты добавляют данные, полученные непосредственно из системы.
В этой лабораторной работе вы научитесь определять переменные групп и хостов, собирать факты RHEL и создавать отчеты для каждого псевдонима хоста.
Создание проекта для работы с переменными
На этом этапе вы создадите проект с псевдонимами веб-хостов и каталогами для переменных.
cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,inventory/host_vars,playbooks,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[web]
web1 ansible_connection=local
web2 ansible_connection=local
EOF
Оба хоста являются локальными псевдонимами, но Ansible по-прежнему разрешает переменные отдельно для каждого имени в инвентаре. Это позволяет практиковаться в переопределении настроек для конкретных хостов без использования дополнительных виртуальных машин.
Установка общих переменных группы
На этом этапе вы определите значения, которые будут применяться ко всем хостам в группе web.
Перед выполнением команд на этом этапе вернитесь в каталог проекта Ansible. Это обеспечит стабильность выполнения команд, даже если LabEx запускает каждый шаг отдельно.
cd /home/labex/project/rhce-ansible
cat > inventory/group_vars/web.yml <<'EOF'
service_name: demo-web
service_port: 8080
EOF
Эти значения применяются к каждому хосту в группе web. На данном этапе и web1, и web2 будут использовать порт 8080.
cat inventory/group_vars/web.yml
Переопределение переменной для одного хоста
На этом этапе вы переопределите service_port только для web2. Переменные хостов имеют более высокий приоритет, чем переменные групп.
Перед выполнением команд на этом этапе вернитесь в каталог проекта Ansible.
cd /home/labex/project/rhce-ansible
cat > inventory/host_vars/web2.yml <<'EOF'
service_port: 9090
EOF
Этот файл имеет более высокий приоритет, чем group_vars/web.yml, поэтому только web2 должен использовать порт 9090. web1 продолжит использовать значение, заданное для группы.
ansible-inventory --host web2
Изучите полученный вывод для хоста и найдите service_port. Эта команда показывает конечное значение, которое Ansible будет использовать перед запуском любого плейбука.
Написание плейбука для создания отчета на основе фактов
На этом этапе вы напишете плейбук, который объединяет переменные инвентаря с собранными фактами. Факт ansible_distribution_major_version извлекается непосредственно с управляемого хоста.
Перед выполнением команд на этом этапе вернитесь в каталог проекта Ansible.
cd /home/labex/project/rhce-ansible
cat > playbooks/report-vars.yml <<'EOF'
---
- name: Render variable and fact reports
hosts: web
gather_facts: true
tasks:
- name: Write per-host variable report
ansible.builtin.copy:
dest: "/home/labex/project/rhce-ansible/reports/{{ inventory_hostname }}.txt"
content: |
host={{ inventory_hostname }}
service={{ service_name }}
port={{ service_port }}
rhel_major={{ ansible_distribution_major_version }}
mode: '0644'
EOF
Отчет объединяет два источника данных: переменные инвентаря, такие как service_port, и собранные факты, такие как ansible_distribution_major_version. Это распространенный шаблон, когда конфигурация зависит как от заданных намерений, так и от обнаруженных деталей системы.
ansible-playbook playbooks/report-vars.yml --syntax-check
Запуск отчета по переменным
На этом этапе вы запустите плейбук и сравните отчеты. Общие значения должны совпадать, в то время как порт для web2 должен отличаться.
Перед выполнением команд на этом этапе вернитесь в каталог проекта Ansible.
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/report-vars.yml | tee reports/report-run.txt
В процессе выполнения сначала должны быть собраны факты, а затем записан отчет для каждого хоста. Успешное завершение с failed=0 означает, что оба псевдонима хостов успешно сформировали свои отчеты.
cat reports/web1.txt reports/web2.txt
Сравните строки port=: для web1 должно быть указано 8080, а для web2 — 9090. Общее значение service= должно совпадать в обоих отчетах.
Резюме
Вы определили переменные групп, переопределили значение с помощью переменных хостов, собрали факты и создали отчеты, которые наглядно демонстрируют, как Ansible разрешает каждое значение.


