Какие знаешь основные элементы в Ansible playbook?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Основные элементы Ansible Playbook
Ansible Playbook — это YAML-файл, описывающий набор задач для управления конфигурацией и развертыванием. Вот ключевые структурные элементы, которые я использую в своей практике:
1. Базовая структура Playbook
Каждый playbook начинается с декларации:
---
- name: Configure web servers
hosts: webservers
become: yes
vars:
http_port: 80
tasks:
- name: Ensure Apache is installed
apt:
name: apache2
state: present
2. Ключевые директивы верхнего уровня
hosts— определяет целевые узлы или группы из инвентаряname— описательное имя play или задачиbecome— привилегированное выполнение (аналог sudo)vars— переменные уровня playtasks— основная секция с выполняемыми задачамиhandlers— обработчики, запускаемые по уведомлениюpre_tasksиpost_tasks— задачи до и после основного блока
3. Модули и задачи (Tasks)
Задачи используют модули Ansible — это фундаментальные строительные блоки:
tasks:
- name: Copy configuration file
copy:
src: /local/files/nginx.conf
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
notify: restart nginx
Важные аспекты задач:
- Каждая задача должна иметь уникальный
name - Используется идемпотентность — повторное выполнение дает тот же результат
- Доступны сотни модулей:
file,template,systemd,apt,yum,docker_container
4. Обработчики (Handlers)
Handlers выполняются только при изменениях:
handlers:
- name: restart nginx
systemd:
name: nginx
state: restarted
enabled: yes
Особенности:
- Вызываются через
notifyв задачах - Запускаются один раз в конце play
- Сохраняют порядок выполнения
5. Переменные (Variables)
Многоуровневая система переменных:
vars:
app_version: "2.1.0"
vars_files:
- vars/main.yml
tasks:
- name: Use variable
debug:
msg: "Deploying version {{ app_version }}"
Источники переменных:
- Определение в playbook (
vars) - Отдельные файлы (
vars_files) - Файлы инвентаря
- Facts (автоматически собираемая информация)
- Роли (roles)
- Командная строка (
-e)
6. Условные конструкции и циклы
Условия:
tasks:
- name: Install package only on Debian
apt:
name: nginx
when: ansible_facts['os_family'] == "Debian"
Циклы:
tasks:
- name: Add multiple users
user:
name: "{{ item.name }}"
state: present
groups: "{{ item.groups }}"
loop:
- { name: 'alice', groups: 'sudo' }
- { name: 'bob', groups: 'docker' }
7. Роли (Roles)
Роли организуют playbook в модульную структуру:
roles/
common/
tasks/main.yml
handlers/main.yml
templates/nginx.conf.j2
files/
vars/main.yml
defaults/main.yml
meta/main.yml
Использование в playbook:
roles:
- common
- { role: webserver, port: 8080 }
8. Блоки (Blocks)
Группировка задач с общими параметрами:
tasks:
- name: Configure database
block:
- name: Install PostgreSQL
apt: name=postgresql
- name: Create database
postgresql_db: name=mydb
become: yes
become_user: postgres
when: db_required
9. Теги (Tags)
Селективное выполнение задач:
tasks:
- name: Install packages
apt: name={{ item }}
loop: ['nginx', 'mysql']
tags:
- packages
- common
10. Подключение и привилегии
- hosts: all
gather_facts: false
connection: ssh # или local, docker, winrm
become: yes
become_method: sudo
become_user: root
Практические рекомендации
- Структурируйте сложные playbooks через роли для повторного использования
- Используйте шаблоны Jinja2 в модуле
templateдля динамических конфигов - Тегируйте задачи для гибкого выполнения (
--tags,--skip-tags) - Валидируйте синтаксис командой
ansible-playbook --syntax-check - Тестируйте в dry-run режиме с
--check - Разделяйте переменные по уровням: defaults < vars < inventory < command line
- Используйте
ansible-lintдля проверки качества playbooks
Пример комплексного playbook:
---
- name: Deploy web application
hosts: production
vars_files:
- secrets/vault.yml
pre_tasks:
- name: Update package cache
apt: update_cache=yes
when: ansible_facts['os_family'] == "Debian"
roles:
- role: common
tags: common
- role: nginx
vars:
nginx_port: 443
tasks:
- name: Deploy application code
git:
repo: "{{ git_repository }}"
dest: "/var/www/app"
version: "{{ app_version }}"
tags: deploy
handlers:
- name: reload nginx
systemd:
name: nginx
state: reloaded
post_tasks:
- name: Verify deployment
uri:
url: "http://localhost/health"
status_code: 200
Понимание этих элементов позволяет создавать эффективные, поддерживаемые и масштабируемые playbooks для автоматизации инфраструктуры любой сложности.