← Назад к вопросам

Какие знаешь основные элементы в Ansible playbook?

1.7 Middle🔥 231 комментариев
#Ansible и управление конфигурацией

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Основные элементы 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 — переменные уровня play
  • tasks — основная секция с выполняемыми задачами
  • 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

Практические рекомендации

  1. Структурируйте сложные playbooks через роли для повторного использования
  2. Используйте шаблоны Jinja2 в модуле template для динамических конфигов
  3. Тегируйте задачи для гибкого выполнения (--tags, --skip-tags)
  4. Валидируйте синтаксис командой ansible-playbook --syntax-check
  5. Тестируйте в dry-run режиме с --check
  6. Разделяйте переменные по уровням: defaults < vars < inventory < command line
  7. Используйте 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 для автоматизации инфраструктуры любой сложности.

Какие знаешь основные элементы в Ansible playbook? | PrepBro