
Привет, Хабр!
Ansible — это инструмент для автоматизации, который облегчает управление конфигурациями, развертывание приложений и оркестрацию сложных задач. Его главная сила заключается в простоте использования и высокой читаемости плейбуков, которые представляют собой сценарии автоматизации, написанные на YAML.
Плейбуки в Ansible — основной инструмент Ansible. Плейбук состоит из одного или нескольких игр (plays), каждая из которых, в свою очередь, содержит задачи (tasks). Эти задачи выполняются последовательно, что позволяет создавать сложные, но легко читаемые сценарии автоматизации.
В этой статье мы рассмотрим как работать с плейбуками в Ansible.
Написание плейбуков
Мы уже знаем, что для написания плейбуков в Ansible используют Yaml. Основные правила синтаксиса YAML:
Отступы: YAML использует отступы для определения уровня вложенности. Обычно используются пробелы, а не табуляции.
Ключ-значение: каждая строка представляет собой пару ключ-значение, разделенные двоеточием.
Списки: списки элементов обозначаются дефисом (-).
Пример базового 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 состоят из основных элементов:
Header: определяет общие сведения о плейбуке, такие как название и целевые хосты.
Variables: используются для хранения данных, которые могут быть использованы повторно в плейбуке.
Tasks: определяют конкретные действия, которые должны быть выполнены на хостах.
Handlers: выполняются при изменении состояния системы, например, перезапуск службы после обновления конфигурации.
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, приглашаем вас заглянуть в каталог курсов. Там вы найдёте программы, где подробно разбираются плейбуки, роли, модули и другие ключевые механизмы Ansible.
Также рекомендуем ознакомиться с календарём открытых уроков — это возможность спокойно оценить подход и содержание занятий до старта обучения.
Чтобы оставаться в курсе самых актуальных технологий и трендов, подписывайтесь на Telegram-канал OTUS.
