Введение
После настройки инвентаря и доступа одной из типичных задач является развертывание базовых файлов (baseline files). К таким файлам могут относиться баннеры, фрагменты конфигурации служб или маркеры соответствия требованиям, которые должны быть единообразными на всех хостах, но при этом содержать специфичные для каждого хоста значения.
В этой лабораторной работе вы создадите небольшой инвентарь для нескольких хостов, определите групповые переменные, напишете шаблон, запустите плейбук и проверите корректность развертывания базовых файлов для каждого хоста.
Создание проекта развертывания базовой конфигурации
На этом этапе вы создадите проект, включающий инвентарь, шаблоны, файлы и плейбуки. Такая структура позволяет отделить повторно используемый исходный контент от логики автоматизации.
Создайте проект и перейдите в него.
cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,playbooks,files,templates,managed}
cd rhce-ansible
Создайте файл ansible.cfg.
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
retry_files_enabled = False
interpreter_python = auto_silent
EOF
Директории разделяют роли в рабочем процессе: files содержит контент, который копируется без изменений, templates хранит контент, обрабатываемый с помощью переменных, playbooks содержит логику автоматизации, а в managed будут отображаться итоговые результаты для каждого хоста.
Создание инвентаря и базовых переменных
На этом этапе вы определите два псевдонима управляемых хостов и общие базовые переменные. Эти переменные будут позже использованы в шаблоне.
Перед выполнением команд на этом этапе вернитесь в директорию проекта Ansible. Это обеспечит стабильность выполнения команд, даже если LabEx запускает каждый этап отдельно.
cd /home/labex/project/rhce-ansible
Создайте инвентарь.
cat > inventory/hosts <<'EOF'
[managed]
node1 ansible_connection=local
node2 ansible_connection=local
EOF
Два псевдонима позволяют одному плейбуку создавать два отдельных управляемых вывода. Несмотря на то, что оба псевдонима работают на одной и той же виртуальной машине, Ansible будет по-разному интерпретировать inventory_hostname для каждого хоста.
Создайте групповые переменные для управляемых хостов.
cat > inventory/group_vars/managed.yml <<'EOF'
baseline_owner: labex
baseline_environment: training
EOF
Эти переменные применяются к каждому хосту в группе managed. Они представляют собой значения, которые должны быть общими для всей базовой конфигурации, в то время как имя хоста останется специфичным для каждого узла.
Создание исходного файла и шаблона
На этом этапе вы создадите исходный контент. Обычный файл будет скопирован без изменений. Шаблон Jinja2 использует переменные, такие как inventory_hostname и baseline_environment, для формирования специфичного для хоста вывода.
Перед выполнением команд на этом этапе вернитесь в директорию проекта Ansible.
cd /home/labex/project/rhce-ansible
Создайте общий файл баннера.
cat > files/banner.txt <<'EOF'
Managed by RHCE Ansible Prep
EOF
Баннер — это обычный исходный контент. Он будет скопирован в точности так, как написан, поэтому он полезен для текста, который не должен меняться в зависимости от хоста.
Создайте шаблон.
cat > templates/baseline.conf.j2 <<'EOF'
host={{ inventory_hostname }}
environment={{ baseline_environment }}
owner={{ baseline_owner }}
EOF
Шаблон содержит выражения Jinja2. Когда Ansible обрабатывает его, inventory_hostname превращается в node1 или node2, а базовые переменные берутся из inventory/group_vars/managed.yml.
Написание плейбука для развертывания базовой конфигурации
На этом этапе вы напишете плейбук, который создает по одной директории для каждого псевдонима хоста и развертывает как общий баннер, так и обработанный шаблон. Поскольку плейбук хранится в playbooks, пути к исходным файлам указываются как ../files и ../templates.
Перед выполнением команд на этом этапе вернитесь в директорию проекта Ansible.
cd /home/labex/project/rhce-ansible
Создайте плейбук.
cat > playbooks/deploy-baseline.yml <<'EOF'
---
- name: Deploy baseline files to managed aliases
hosts: managed
gather_facts: false
tasks:
- name: Create per-host baseline directory
ansible.builtin.file:
path: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}"
state: directory
mode: '0755'
- name: Copy shared banner
ansible.builtin.copy:
src: ../files/banner.txt
dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/banner.txt"
mode: '0644'
- name: Render baseline configuration
ansible.builtin.template:
src: ../templates/baseline.conf.j2
dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/baseline.conf"
mode: '0644'
EOF
Рассматривайте эти три задачи как последовательность развертывания. Сначала для каждого псевдонима хоста создается целевая директория, затем копируется статический баннер, и, наконец, шаблон преобразуется в конфигурационный файл, специфичный для конкретного хоста.
Выполните проверку синтаксиса.
ansible-playbook playbooks/deploy-baseline.yml --syntax-check
Проверка синтаксиса должна вывести строку playbook:. Это подтверждает, что Ansible может корректно распознать относительные пути к исходным файлам до того, как плейбук начнет запись каких-либо файлов.
Запуск и проверка развертывания
На этом этапе вы запустите плейбук и проверите созданные файлы. Сформированная конфигурация должна различаться в зависимости от имени хоста, сохраняя при этом общие значения среды и владельца.
Перед выполнением команд на этом этапе вернитесь в директорию проекта Ansible.
cd /home/labex/project/rhce-ansible
Запустите плейбук.
ansible-playbook playbooks/deploy-baseline.yml
Первый запуск должен сообщить об изменениях, так как управляемые директории и файлы еще не существуют. Успешный отчет с failed=0 означает, что каждый псевдоним хоста получил базовую конфигурацию.
Проверьте развернутые файлы.
find managed -maxdepth 3 -type f -print
cat managed/node1/banner.txt managed/node1/baseline.conf managed/node2/banner.txt managed/node2/baseline.conf
Файлы banner.txt должны быть идентичны. Файлы baseline.conf должны содержать одинаковые значения environment и owner, но различаться в строке host=.
Резюме
Вы развернули базовые файлы на псевдонимах управляемых хостов, используя переменные инвентаря, общий исходный файл и шаблон Jinja2. Это завершает создание фундамента для воспроизводимых изменений состояния управляемых узлов.


