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
Добавить комментарий