Создание плейбуков Ansible в Ubuntu

Системы управления конфигурациями позволяют централизованно управлять различными системами в автоматическом режиме.

Существует множество систем управления конфигурациями, предназначенных для Linux (например, Chef или Puppet), но они довольно сложные. Ansible – простое альтернативное решение, не требующее большого количества ресурсов.

В предыдущем руководстве речь шла об установке и настройке Ansible. Данное руководство научит создавать плейбуки (playbook) – автоматизированные сценарии для настройки клиентских машин.

Примечание: Данное руководство выполнено на серверах Ubuntu 12.04.

Что такое плейбук?

Плейбуки (playbooks) Ansible – это сценарии, с помощью которых на удалённые серверы отправляются наборы команд. Вместо того чтобы запускать каждую команду Ansible отдельно, вы можете создать целый комплекс команд и поместить его в плейбук.

Плейбуки Ansible пишутся в формате сериализации данных YAML.

Примечание: Если вы не знаете, что такое формат сериализации данных, представьте себе способ перевода программной структуры данных (списков, массивов, словарей и т.д.) в формат, который может легко храниться на диске. JSON – ещё один популярный формат сериализации данных, но YAML проще читать.

Каждый плейбук состоит из одного или нескольких плеев, которые связывают хост с определённой функцией. Для этого Ansible использует задачи (вызовы модулей).

Базовый пример плейбука

Базовый плейбук выглядит так:

---
- hosts: droplets

tasks:

- name: Installs nginx web server
apt: pkg=nginx state=installed update_cache=true
notify:
- start nginx
handlers:
- name: start nginx
service: name=nginx

state=started

Рассмотрим его по частям.

Файл должен начинаться с:

---

Это требование ко всем документам YAML, иначе документ будет некорректно прочитан. Формат YAML позволяет помещать в один файл несколько «документов», и такие документы нужно разделять символами —. Однако Ansible может читать только один документ из одного файла.

Формат YAML очень чувствителен к пробелам. с помощью пробелов он группирует данные. В файлах YAML можно использовать только пробелы; чтобы файл был прочитан корректно, все интервалы должны располагаться последовательно.

Элементы файла, которые находятся на одном уровне, отмечаются одинаковым интервалом.

Элементы, которые начинаются с тире (-), считаются списками. Элементы в формате ключ:значение действуют как хеши или словари. В целом, это всё, что нужно знать о базовом YAML.

Документы YAML определяют иерархическую структуру.

Вторая строка файла:

---
- hosts: droplets

Это список YAML, но поскольку этот компонент находится в крайнем левом углу (на высшем уровне), он также является плеем Ansible. Плей – это группа задач, которая обрабатывается на некотором количестве хостов и обеспечивает выполнение назначенной этим хостам функции. Каждый плей задаёт хост или группу хостов.

Далее следует набор задач:

---
- hosts: droplets
tasks:
- name: Installs nginx web server
apt: pkg=nginx state=installed update_cache=true
notify:
- start nginx

На высшем уровне находится tasks (на одном уровне с hosts). Этот параметр задаёт список пар «ключ:значение».

Name – описательный параметр, в котором можно выбрать любое имя.

Ключ apt – это ссылка на модуль Ansible; она работает примерно как запуск команды ansible или такой команды:

ansible -m apt -a 'whatever' all

Этот модуль позволяет указать пакет и состояние, в котором нужно его поддерживать (например, installed).

Строка update-cache=true обновляет кэш пакетов удалённой машины (apt-get update) перед установкой нового пакета.

Элемент notify содержит список, состоящий из одного элемента – start nginx. Это не внутренняя команда Ansible, а ссылка на обработчик, который при вызове внутри задачи может выполнять определенные функции. Определите обработчик start nginx ниже:

---
- hosts: droplets
tasks:
- name: Installs nginx web server
apt: pkg=nginx state=installed update_cache=true
notify:
- start nginx
handlers:
- name: start nginx
service: name=nginx state=started

Раздел handlers находится на том же уровне, что hosts и tasks. Обработчики тоже являются своего рода задачами, но они могут запускаться только внутри задачи на клиентской машине.

Например, в данном файле есть обработчик, который запускает сервис Nginx после установки пакета. Обработчик не вызывается, если задача «Installs nginx web server» не вносит изменений в систему (то есть если в системе уже установлен такой веб-сервер).

Сохраните этот плейбук в файл nginx.yml.

Такой же файл в JSON будет иметь такой вид:

[
{
"hosts": "droplets",
"tasks": [
{
"name": "Installs nginx web server",
"apt": "pkg=nginx state=installed update_cache=true",
"notify": [
"start nginx"
] }
],
"handlers": [
{
"name": "start nginx",
"service": "name=nginx state=started"
}
] }
]

Как видите, формат YAML гораздо компактнее и его намного проще читать.

Запуск плейбука Ansible

Собрав плейбук, вы можете вызвать его с помощью команды:

ansible-playbook playbook.yml

Например, чтобы установить и запустить на сервере Nginx, можно выполнить команду:

ansible-playbook nginx.yml

Поскольку плейбук сам указывает хост, на котором он должен быть запущен, задавать хост в команде не нужно.

Однако если вам нужно отфильтровать список хостов и запустить плейбук только на одном хосте из списка, добавьте флаг, чтобы указать подмножество хостов в файле:

ansible-playbook -l host_subset playbook.yml

Итак, чтобы установить и запустить Nginx только на host3, нужно ввести:

ansible-playbook -l host3 nginx.yml

Добавление функций в плейбук

На данный момент плейбук имеет такой вид:

---
- hosts: droplets
tasks:
- name: Installs nginx web server
apt: pkg=nginx state=installed update_cache=true
notify:
- start nginx
handlers:
- name: start nginx
service: name=nginx state=started

Он достаточно прост и работает корректно, однако он позволяет только установить и запустить одну программу, а это совсем не много.

Добавление индекс-файла по умолчанию

Плейбук может передать файл с сервера Ansible на хост. Для этого нужно добавить несколько строк:

---
- hosts: droplets
tasks:
- name: Installs nginx web server
apt: pkg=nginx state=installed update_cache=true
notify:
- start nginx
- name: Upload default index.html for host
copy: src=static_files/index.html dest=/usr/share/nginx/www/ mode=0644
handlers:
- name: start nginx
service: name=nginx state=started

Создайте в текущем каталоге новый каталог по имени static_files и поместите в него файл index.html.

mkdir static_files
nano static_files/index.html

В этом файле создайте базовую структуру html.

<html>
<head>
<title>This is a sample page</title>
</head>
<body>
<h1>Here is a heading!</h1>
<p>Here is a regular paragraph.  Wow!</p>
</body>
</html>

Сохраните и закройте файл.

Попробуйте снова запустить плейбук. Теперь Ansible будет проверять все задачи. Ansible увидит, что Nginx уже установлен на этом хосте, и не будет устанавливать его повторно. Затем Ansible обнаружит следующую задачу и заменит стандартный файл index.htmlновым файлом, загруженным с сервера.

 Проверка результатов плейбука

При установке и настройке сервисов вручную почти всегда необходимо знать, успешно ли прошла установка. Эту функциональность можно добавить в плейбук с помощью register.

Это позволяет зарегистрировать результат каждой задачи (failure или success) с помощью переменной, которую можно проверить позже.

При этом нужно настроить Ansible игнорировать ошибки во время выполнения этой задачи, так как обычно Ansible останавливает выполнение плейбука в случае возникновения сбоя.

Для примера попробуйте отредактировать плейбук; пусть он подгружает файл index.php, если такой файл существует. Проверьте выполнение в другой задаче, чтобы программа могла загрузить файл HTML, если файла PHP не существует.

---
- hosts: droplets
tasks:
- name: Installs nginx web server
apt: pkg=nginx state=installed update_cache=true
notify:
- start nginx
- name: Upload default index.php for host
copy: src=static_files/index.php dest=/usr/share/nginx/www/ mode=0644
register: php
ignore_errors: True
- name: Remove index.html for host
command: rm /usr/share/nginx/www/index.html
when: php|success
- name: Upload default index.html for host
copy: src=static_files/index.html dest=/usr/share/nginx/www/ mode=0644
when: php|failed
handlers:
- name: start nginx
service: name=nginx state=started

Примечание: Хост не настроен для обработки PHP-файлов, потому он не будет обработан, даже если программа найдёт такой файл.

Новый плейбук будет подгружать индекс файл PHP на хост. Он регистрирует выполнение этой операции в переменной php.

Если эта операция выполнена успешно, будет запущена задача, которая удалит файл index.html.

Если выполнить операцию не удалось, будет загружен файл index.html.

Заключение

Теперь вы знаете, как автоматизировать задачи Ansible. Этот базовый пример можно использовать в качестве шаблона для разработки сложных библиотек.

Tags: ,

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