Создание и применение повторно используемой роли

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

Введение

Роли позволяют объединять значения по умолчанию, задачи, шаблоны, файлы и обработчики в повторно используемую структуру. Они делают плейбуки лаконичными, а автоматизацию — удобной для совместного использования.

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

Создание проекта для практики с ролями

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

cd /home/labex/project
mkdir -p rhce-ansible/{inventory,roles,playbooks,managed,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
roles_path = ./roles
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[web]
web1 ansible_connection=local
web2 ansible_connection=local
EOF

Параметр roles_path = ./roles указывает Ansible, где искать имена ролей, используемые в плейбуках. Без этого параметра Ansible может искать роли только в системных или пользовательских путях.

Создание структуры каталогов роли

На этом этапе вы создадите основные каталоги роли. В defaults хранятся переменные с низким приоритетом, в tasks — логика задач, а в templates — шаблоны Jinja2. Перед выполнением команд на этом этапе вернитесь в каталог проекта Ansible. Это обеспечит стабильность выполнения команд, даже если LabEx запускает каждый шаг отдельно.

cd /home/labex/project/rhce-ansible
mkdir -p roles/web_banner/{defaults,tasks,templates}
find roles/web_banner -maxdepth 2 -type d | sort

Вывод должен показать корневой каталог роли, а также папки defaults, tasks и templates. Эти имена имеют для Ansible особое значение; например, tasks/main.yml является точкой входа для задач роли.

Добавление значений по умолчанию и шаблона роли

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

cd /home/labex/project/rhce-ansible
cat > roles/web_banner/defaults/main.yml <<'EOF'
---
banner_message: Welcome to RHCE Ansible Prep
EOF
cat > roles/web_banner/templates/banner.txt.j2 <<'EOF'
Host: {{ inventory_hostname }}
Message: {{ banner_message }}
EOF

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

cat roles/web_banner/defaults/main.yml roles/web_banner/templates/banner.txt.j2

Шаблон объединяет текущий алиас хоста с сообщением по умолчанию. Когда роль выполняется для двух хостов, один и тот же шаблон должен сгенерировать две разные строки Host:.

Добавление задач роли и применение роли

На этом этапе вы добавите tasks/main.yml и плейбук, который применяет роль. Роль создает каталог для хоста и генерирует один файл баннера для каждого хоста. Перед выполнением команд на этом этапе вернитесь в каталог проекта Ansible.

cd /home/labex/project/rhce-ansible
cat > roles/web_banner/tasks/main.yml <<'EOF'
---
- name: Ensure host banner directory exists
  ansible.builtin.file:
    path: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}"
    state: directory
    mode: '0755'

- name: Render host banner
  ansible.builtin.template:
    src: banner.txt.j2
    dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/banner.txt"
    mode: '0644'
EOF
cat > playbooks/apply-role.yml <<'EOF'
---
- name: Apply reusable web banner role
  hosts: web
  gather_facts: false
  roles:
    - role: web_banner
EOF

Файл задач роли содержит реализацию, в то время как playbooks/apply-role.yml остается коротким и только указывает имя роли. В этом и заключается главная ценность ролей: повторно используемая структура без необходимости дублировать все задачи в каждом плейбуке.

ansible-playbook playbooks/apply-role.yml --syntax-check

Запуск плейбука на основе роли

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

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/apply-role.yml | tee reports/role-run.txt

Запуск должен выполнить роль один раз для каждого алиаса хоста в группе web. Успешный отчет с failed=0 означает, что роль была найдена через roles_path и её задачи были выполнены.

cat managed/web1/banner.txt managed/web2/banner.txt

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

Резюме

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