Перейти к содержанию

Playbook

Официальная документация Ansible Playbooks

Описание

YAML-файл, в котором описывается жедаемое состояние серверов и последовательность действий Ansible


Пример playbook

- hosts: all # указываем перечень узлов на которых требуется применить playbook
  become: yes # для задач использовать повышение привилегий, обычно через sudo

  tasks: # в данном блоке указывается перечень задач которые требуется выполнить 
    - name: Install nginx app servers # название задачи
      ansible.builtin.apt: # модуль ansible который работает с `apt`
        name: nginx # назввание утилиты для установки 
        state: present # что требуется сделать, в данном случае поставить nginx если его не было раньше

    - name: Make sure a service unit is running
      ansible.builtin.systemd_service: # модуль для работы с systemd
        state: started # указываем что nginx должен работать
        enabled: true # nginx должен запускаться автоматически после ребута сервера
        name: nginx # название утилиты
        notify: Reload nginx # ключевое слово которое вызывает определенный handlers

  handlers: # отдельные задачи, которые запускаются только если они были вызваны через `notify`
    - name: Reload nginx
      ansible.builtin.systemd_service:
        state: reloaded # требуем перезапуск
        name: nginx # название утилиты

Playbook может содержать несколько play

play отвечает на вопрос: на каких серверах применять, а task уже конкретное действие.

Для запуска playbook используется команда

ansible-playbook playbook.yml 


become

Если пользователь SSH не root, а задаче нужны root права, используется

become: true

graph TD
A[ansible controller node]
--> B[SSH под уз devops]
B --> C[sudo root]

Если sudo требует пароль:

ansible-playbook site.yml -K (--ask-become-pass)
После потребуется ввод пароля


Переменные

Вместо жестко заданных занчений:

name:
  - curl
  - git
  - vim 

Можно использовать переменную:

common_packages:
  - curl
  - git
  - vim

Переменная вызывается через Jinja-синтаксис:

{{ variable_name }}


default роли

Для роли можно задать значения по умолчанию

roles/common/defaults/main.yml

например:

common_packages:
  - curl
  - git
  - ca-certificates
  - vim
  - htop

задача:

- name: Install common packages
  ansible.builtin.apt:
    name: "{{ common_packages }}"
    state: present

Логика:

graph TD
A[defaults/main.yml]
--> B[данные]
B --> C[tasks/main.yml]
C --> D[логика]

group_vars

Переменные можно назначать inventory-группе

Например:

group_vars/app.yml

nginx_port: 8080

Тогда эту переменную получают узлы входящие в группу [app]


Templates и Jinja2

Вместо одинакового статического файла можно использовать шаблон

Например:

index.html.j2

<h1>DevOps Lab</h1>
<p>Server: {{ inventory_hostname }}</p>
<p>OS: {{ ansible_distribution }}</p>

Разволачивается через:

- name: Deploy index page
  ansible.builtin.template:
    src: index.html.j2
    dest: /var/www/html/index.html

Один шаблон на разных хостах может дать разные результаты.


Handlers

Описание

Блок с задачами, которые выполняются только если они были вызваны через notify

Они позволяют выполнять действия, которые должны быть выполнены только при изменении состояния.

Пример

- name: Перезапустить nginx
  service:
    name: nginx
    state: restarted
  1. Ansible выполняет задачи по порядку
  2. Если задача успешно завершается и у нее есть notify, Ansible запускает указанный handler
  3. handler выполняется только один раз, даже если он вызывается несколько раз.

  • Это позволяет оптимизировать выполнение задач, так как handlers не запускается, если не требуется
  • Используется часто для перезапуска служб, обновления конфигураций и других действий, которые должны быть выполнены только при изменении состояния

Таким образом notify и handlers помогают сделать ansbile более эффективным и управляемым


Roles

Когда playbook становится большим, задачи разбиваются по ролям.

Например:

roles/
|- common/
|- nginx/

Структура роли:

roles/nginx/
|- tasks/
  |- main.yml
|- handlers/
  |- main.yml
|- templates/
|- files/
|- defaults/
  |- main.yml
|- vars/
  |- main.yml

Ansible знает эти имена каталогов автоматически, поэтому достаточно в playbook:

roles:
  - nginx
И ansible сам ищет:
roles/nginx/tasks/main.yml
roles/nginx/handlers/main.yml
roles/nginx/templates/


loop

Если нужно повторить одну задачу несколько раз:

- name: Create directories
  ansible.builtin.file:
    path: "{{ item }}"
    state: directory
    owner: devops
    group: devops
    mode: '0755'

  loop:
    - /opt/devops-lab
    - /opt/devops-lab/config
    - /opt/devops-lab/logs

На каждой итерации:

{{ item }}

получает следующее значение.


when

позволяет выполнять задачу только при определенном условии

Например

- name: Install PostgreSQL client
  ansible.builtin.apt:
    name: postgresql-client
    state: present
  when: "'app' in group_names"

На серверах группы [app] задача выполнится, на остальных будет skipped


changed_when

Позволяет определить, изменилась ли задача, даже если стандартный проверочный тест (check_mode) не обнаружил изменений. Она особенно полезна в сложных сценариях, где стандартные проверки не улавливают изменения.

Например:

- name: Check filesystem
  ansible.builtin.command:
    cmd: df -h /

ansible может показать changed

Поэтому явно указываем:

- name: Check filesystem
  ansible.builtin.command:
    cmd: df -h /
  register: disk_info
  changed_when: false

Эта задача читает только состояние системы и не должна быть changed


group_names

встроенная переменная, содержащая inventory-группы текущего хоста

например для app01

group_names:
  - app

поэтому можно написать:

when: "'app' in group_names"


register

результат задачи можно сохранить в переменную

- name: Check filesystem
  ansible.builtin.command:
    cmd: df -h /
  register: disk_info

теперь появляется объект disk_info у которого могут быть поля:

disk_info.rc
disk_info.stdout
disk_info.stderr
disk_info.stdout_lines



- name: Show disk usage
  ansible.builtin.debug:
    var: disk_info.stdout

Полезные команды

ansible-playbook site.yml --syntax-check
# проверка playbook на синтаксические ошибки

ansible-playbook --check site.yml --list-tasks
# выводит перечень tasks которые содержатся в playbook 

ansible-playbook --check site.yml --list-tasks
# выводит перечень hosts которые разделены по tasks в playbook 

Последняя проверка 18.09.2026