Плейбуки в Ansible

64fd43e85a1bbb639cc0667da658a9dc.png

Привет, Хабр!

Ansible — это инструмент для автоматизации, который облегчает управление конфигурациями, развертывание приложений и оркестрацию сложных задач. Его главная сила заключается в простоте использования и высокой читаемости плейбуков, которые представляют собой сценарии автоматизации, написанные на YAML.

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

В этой статье мы рассмотрим как работать с плейбуками в Ansible.

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

Мы уже знаем, что для написания плейбуков в Ansible используют Yaml. Основные правила синтаксиса YAML:

  1. Отступы: YAML использует отступы для определения уровня вложенности. Обычно используются пробелы, а не табуляции.

  2. Ключ-значение: каждая строка представляет собой пару ключ-значение, разделенные двоеточием.

  3. Списки: списки элементов обозначаются дефисом (-).

Пример базового YAML-документа:

name: Ivan
age: 30
address:
  street: 123 Main St
  city: Anytown
  state: CA
phone_numbers:
  - type: home
    number: 123-456-7890
  - type: work
    number: 987-654-3210

Плейбуки Ansible состоят из основных элементов:

  1. Header: определяет общие сведения о плейбуке, такие как название и целевые хосты.

  2. Variables: используются для хранения данных, которые могут быть использованы повторно в плейбуке.

  3. Tasks: определяют конкретные действия, которые должны быть выполнены на хостах.

  4. Handlers: выполняются при изменении состояния системы, например, перезапуск службы после обновления конфигурации.

  5. Conditionals: позволяют выполнять задачи только при выполнении определенных условий.

Рассмотрим базовый плейбук, который устанавливает и настраивает веб-сервер Apache:

---
- name: Установка и настройка Apache
  hosts: webservers
  become: yes
  vars:
    http_port: 80
    max_clients: 200
  tasks:
    - name: Установка Apache
      apt:
        name: apache2
        state: present

    - name: Обновление конфигурации Apache
      template:
        src: templates/apache2.conf.j2
        dest: /etc/apache2/apache2.conf
      notify:
        - Перезапуск Apache

    - name: Обеспечение запуска Apache
      service:
        name: apache2
        state: started
        enabled: yes

  handlers:
    - name: Перезапуск Apache
      service:
        name: apache2
        state: restarted

В этом плейбуке:

  • hosts указывает целевые хосты.

  • become: yes указывает, что задачи должны выполняться с привилегиями суперпользователя.

  • vars определяет переменные, используемые в плейбуке.

  • tasks содержит список задач, таких как установка Apache, обновление конфигурации и обеспечение запуска службы.

  • handlers содержит обработчики, которые выполняются при уведомлении, например, перезапуск Apache после обновления конфигурации.

Условные выражения позволяют выполнять задачи только при выполнении определенных условий. Например, установка Nginx только на Debian-базированных системах:

- name: Установка Nginx
  apt:
    name: nginx
    state: present
  when: ansible_os_family == "Debian"

Пример плейбука для установки и настройки MySQL:

---
- name: Установка и настройка MySQL
  hosts: databases
  become: yes
  tasks:
    - name: Установка MySQL
      apt:
        name: mysql-server
        state: present

    - name: Настройка MySQL
      template:
        src: templates/my.cnf.j2
        dest: /etc/mysql/my.cnf
      notify:
        - Перезапуск MySQL

    - name: Обеспечение запуска MySQL
      service:
        name: mysql
        state: started
        enabled: yes

  handlers:
    - name: Перезапуск MySQL
      service:
        name: mysql
        state: restarted

Пример плейбука для настройки SSH:

---
- name: Настройка SSH
  hosts: all
  become: yes
  tasks:
    - name: Обновление конфигурации SSH
      lineinfile:
        path: /etc/ssh/sshd_config
        regexp: '^#PermitRootLogin'
        line: 'PermitRootLogin no'
      notify:
        - Перезапуск SSH

  handlers:
    - name: Перезапуск SSH
      service:
        name: sshd
        state: restarted

Прочие возможности

Роли и модули в помогают структурировать и упрощать плейбуки.

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

Пример структуры роли:

my_role/
├── defaults
│   └── main.yml
├── files
│   └── my_file.txt
├── handlers
│   └── main.yml
├── tasks
│   └── main.yml
├── templates
│   └── my_template.j2
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

Пример роли для установки и настройки Apache:

# tasks/main.yml
---
- name: Установка Apache
  apt:
    name: apache2
    state: present

- name: Обновление конфигурации Apache
  template:
    src: my_template.j2
    dest: /etc/apache2/apache2.conf
  notify:
    - Перезапуск Apache

- name: Обеспечение запуска Apache
  service:
    name: apache2
    state: started
    enabled: yes

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

Пример использования модуля apt для установки пакета:

- name: Установка Apache
  apt:
    name: apache2
    state: present

Подробнее с другими модулями можно познакомиться здесь.

Шаблоны Jinja2 позволяют динамически генерировать файлы конфигурации на основе переменных. Файлы шаблонов имеют расширение .j2.

Пример шаблона Apache конфигурации (templates/apache2.conf.j2):

Listen {{ http_port }}
MaxClients {{ max_clients }}

Пример использования шаблона в задаче:

- name: Обновление конфигурации Apache
  template:
    src: templates/apache2.conf.j2
    dest: /etc/apache2/apache2.conf
  notify:
    - Перезапуск Apache

Условные операторы позволяют выполнять задачи только при выполнении определенных условий.

Пример:

- name: Установка Nginx на Debian
  apt:
    name: nginx
    state: present
  when: ansible_os_family == "Debian"

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

Развертывание веб-приложения с БД и балансировщиком нагрузки:

---
- name: Развертывание веб-приложения
  hosts: all
  become: yes

  roles:
    - load_balancer
    - web_server
    - database

# load_balancer/tasks/main.yml
---
- name: Установка и настройка HAProxy
  apt:
    name: haproxy
    state: present

- name: Обновление конфигурации HAProxy
  template:
    src: haproxy.cfg.j2
    dest: /etc/haproxy/haproxy.cfg
  notify:
    - Перезапуск HAProxy

- name: Обеспечение запуска HAProxy
  service:
    name: haproxy
    state: started
    enabled: yes

# web_server/tasks/main.yml
---
- name: Установка и настройка Apache
  apt:
    name: apache2
    state: present

- name: Обновление конфигурации Apache
  template:
    src: apache2.conf.j2
    dest: /etc/apache2/apache2.conf
  notify:
    - Перезапуск Apache

- name: Обеспечение запуска Apache
  service:
    name: apache2
    state: started
    enabled: yes

# database/tasks/main.yml
---
- name: Установка и настройка MySQL
  apt:
    name: mysql-server
    state: present

- name: Обновление конфигурации MySQL
  template:
    src: my.cnf.j2
    dest: /etc/mysql/my.cnf
  notify:
    - Перезапуск MySQL

- name: Обеспечение запуска MySQL
  service:
    name: mysql
    state: started
    enabled: yes

Тестирование и отладка плейбуков

Режим проверки или check mode позволяет выполнять плейбуки без внесения реальных изменений в целевые системы.

Пример запуска плейбука в режиме проверки:

ansible-playbook my_playbook.yml --check

В режиме проверки Ansible симулирует выполнение задач, выводя на экран предполагаемые изменения.

Ansible Vault предназначен для защиты чувствительных данных. С помощью Vault можно зашифровывать и дешифровывать файлы с конфигурацией и переменными.

Для шифрования файла используется ansible-vault encrypt:

ansible-vault encrypt secrets.yml

Для дешифрования файла используется ansible-vault decrypt:

ansible-vault decrypt secrets.yml

Чтобы использовать зашифрованные файлы в плейбуках, необходимо добавить параметр --ask-vault-pass:

ansible-playbook my_playbook.yml --ask-vault-pass

Пример использования зашифрованного файла с переменными:

---
- name: Установка и настройка MySQL
  hosts: databases
  become: yes
  vars_files:
    - secrets.yml
  tasks:
    - name: Установка MySQL
      apt:
        name: mysql-server
        state: present

Ansible-lint — это инструмент для анализа плейбуков на наличие ошибок и несоответствий стилю. Он помогает улучшить качество кода.

Установка ansible-lint:

pip install ansible-lint

Запуск ansible-lint для проверки плейбука:

ansible-lint my_playbook.yml

Ansible-lint анализирует плейбук и выводит предупреждения и ошибки, помогая обнаружить проблемы до выполнения плейбука.

Для отладки плейбуков можно использовать:

  • Модуль debug: позволяет выводить значения переменных и сообщения для диагностики.

    - name: Отладка переменных
      debug:
        var: my_variable
  • Флаг verbosity (-v): увеличивает уровень подробности вывода Ansible.

    ansible-playbook my_playbook.yml -v
  • Модуль assert: проверяет условия и останавливает выполнение при их нарушении.

    - name: Проверка значения переменной
      assert:
        that:
          - my_variable == "expected_value"

А подробнее с Ansible и прочими инструментами, вы можете познакомиться на курсе Infrastructure as a code. Например, уже сегодня пройдет бесплатный вебинар про знакомство с популярным инструментом Terraform. Регистрация доступна по ссылке.

Habrahabr.ru прочитано 2335 раз