Развертывание базовых файлов на управляемых узлах

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

Введение

После настройки инвентаря и доступа одной из типичных задач является развертывание базовых файлов (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. Это завершает создание фундамента для воспроизводимых изменений состояния управляемых узлов.