Ansible. Создание Playbook.
Playbooks Ansible – это сценарии, с помощью которых на удалённые серверы отправляются наборы команд. Вместо того чтобы запускать каждую команду Ansible отдельно, вы можете создать целый комплекс команд и поместить его в playbook.
Также playbook можно рассматривать как описание состояния ресурсов системы, в котором она должна находиться в конкретный момент времени, включая установленные пакеты, запущенные службы, созданные файлы и многое другое. Ansible проверяет, что каждый из ресурсов системы находится в ожидаемом состоянии и пытается исправить состояние ресурса, если оно не соответствует ожидаемому.
Плейбуки Ansible пишутся в формате сериализации данных YAML.
В качестве примера напишем несколько playbook’ов развёртывания сервисов на сервер Debian 10.
Playbook для установки nginx.
Для начала создадим playbook для установки nginx.
# touch ./nginx.yml
--- - hosts: mysql.sysad.su tasks: - name: Installs nginx web server apt: pkg=nginx state=latest update_cache=true notify: - start nginx handlers: - name: start nginx service: name=nginx state=started
Файл должен начинаться с:
---
Это требование ко всем документам YAML, иначе документ будет некорректно прочитан.
Формат YAML очень чувствителен к пробелам. с помощью пробелов он группирует данные. В файлах YAML можно использовать только пробелы; чтобы файл был прочитан корректно, все интервалы должны располагаться последовательно.
Элементы файла, которые находятся на одном уровне, отмечаются одинаковым интервалом.
Элементы, которые начинаются с тире (-), считаются списками. Элементы в формате ключ:значение действуют как хеши или словари. В целом, это всё, что нужно знать о базовом YAML.
Во второй строке помещается список - hosts: ИмяХоста или ГруппаХостов
, таким образом задаём хост или множество хостов, для которых выполняется playbook.
Например, в файле /etc/ansible/hosts определена группа [dbservers], в которую входят два хоста mysql.sysad.su и mysql2.sysad.su :
[dbservers] mysql.sysad.su mysql2.sysad.su
Нижеследующая конструкция задаёт применение playbook ко всем хостам группы dbservers:
--- - hosts: dbservers
Далее переходим к описанию набор задач (task):
--- - hosts: mysql.sysad.su tasks: - name: Installs nginx web server apt: pkg=nginx state=latest update_cache=true notify: - start nginx
На высшем уровне находится tasks (на одном уровне с hosts). Этот параметр задаёт список пар «ключ:значение».
Первый ключ «name» – описательный параметр, в котором можно указать любое имя.
Следующий ключ — «apt». Это ссылка на модуль Ansible, точно так же, как когда мы используем команду ansible и вводим что-то наподобие: ansible -m apt -a 'whatever' all
Этот модуль позволяет нам указать пакет и состояние, в котором он должен находиться, которое в нашем случае latest
.
Строка update-cache=true
обновляет кэш пакетов удалённой машины (apt-get update
) перед установкой нового пакета.
Пункт notify содержит список с одним пунктом, который называется start nginx
. Это не внутренняя команда Ansible, это ссылка на обработчик, который может выполнять определенные функции при вызове из задачи. Ниже мы определим обработчик start nginx
.
--- - hosts: mysql.sysad.su tasks: - name: Installs nginx web server apt: pkg=nginx state=latest update_cache=true notify: - start nginx handlers: - name: start nginx service: name=nginx state=started
Раздел handlers расположен на том же уровне, что и hosts и tasks. Обработчики похожи на задачи, но они запускаются только тогда, когда задача сообщает им о том, что в клиентской системе произошли изменения.
Например, у нас здесь есть обработчик, который запускает службу Nginx после установки пакета. Обработчик не вызывается, если задача Installs nginx web server не приведет к изменениям в системе, что означает, что пакет должен был быть установлен, но его там еще не было.
Playbook’и запускаются на выполнение командой ansible-playbook
, для нашего примера:
# ansible-playbook nginx.yml
Результат выполнения:
Выполнение команды привело к установке и запуску nginx на узле mysql.sysad.su. Проверяем работу nginx по ссылке: http://mysql.sysad.su
Расширим функциональность playbook за счёт замены индексного файла index.html
Создаём каталог и в нём index.html:
# mkdir ./static_files
touch ./index.html
Добавляем в index.html
<html> <head> <title>This is a sample page</title> </head> <body> <p>It's works!</p> </body> </html>
--- - hosts: mysql.sysad.su tasks: - name: Installs nginx web server apt: pkg=nginx state=latest update_cache=true notify: - start nginx - name: Upload default index.html for host copy: src=static_files/index.html dest=/var/www/html/ mode=0644 handlers: - name: start nginx service: name=nginx state=started
При повторном запуске playbook’а Ansible проверит каждую задачу. Он увидит, что Nginx уже установлен на хосте, поэтому оставит его в покое. Он увидит новый раздел задач и заменит index.html файл на управляемом хосте тем, который находится на сервере управления.
Создаём файл playbook для развёртывания MariaDB:
# touch ./mysqlserver.yml
Задаём пароль пользователя root посредством переменной:
--- - hosts: dbservers vars: mysql_root_password: SecretWord
Добавить комментарий