![](https://habrastorage.org/getpro/habr/upload_files/64f/d43/e85/64fd43e85a1bbb639cc0667da658a9dc.png)
Привет, Хабр!
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 и прочими инструментами, вы можете познакомиться на курсе Infrastructure as a code. Например, уже сегодня пройдет бесплатный вебинар про знакомство с популярным инструментом Terraform. Регистрация доступна по ссылке.