Плейбуки в Ansible

—

от автора

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

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. Регистрация доступна по ссылке.


ссылка на оригинал статьи https://habr.com/ru/articles/821263/


Комментарии

Добавить комментарий

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