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

Published by Leave your thoughts

В предыдущем руководстве речь шла о том, что такое управление конфигурацией и как внедрить эту технологию в свою инфраструктуру.

Примечание: Руководство выполнено на Ubuntu 14.04 и Apache.

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

  • Обновление индекса пакетов.
  • Установка Apache.
  • Создание пользовательского каталога document root.
  • Создание в нём файла index.html.
  • Применение шаблона для установки пользовательского виртуального хоста.
  • Перезапуск Apache.

Примечание: Данное руководство сосредоточено на создании плейбуков – сценариев Ansible для автоматизации настройки. Больше о терминологии Ansible можно прочитать здесь.

Начало работы

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

Терминология Ansible

  • Контроллер: машина, на которую установлен сервер Ansible.
  • Инвентарь: INI-файл, в котором хранится информация о ведомых серверах.
  • Плейбук: точка входа для оркестровки Ansible, сценарий, в котором определены параметры машины, которую нужно настроить.
  • Задача: блок, который определяет одну процедуру, которую нужно выполнить (например, установка пакета).
  • Модуль: инструмент, который берёт на себя какую-либо задачу системы (например, управление пакетами или создание и изменение файлов). Ansible предлагает множество встроенных модулей, но вы также можете создавать новые пользовательские модули.
  • Роль: предопределённый способ организации плейбуков и других файлов, позволяющий совместно и повторно использовать фрагменты настроек.
  • Плей: процесс оркестровки от начала до конца.
  • Факты: глобальные переменные системы.
  • Обработчики: изменяют статус сервиса (запуск, остановка и т.д.).

Оркестровка Ansible пишется на простом языке сериализации данных YAML.

Задачи

Каждая задача определяет один шаг оркестровки. Как правило, в задачах используются модули или простые команды. Задача выглядит так:

- name: This is a task
apt: pkg=vim state=latest

Элемент name опционален, но его рекомендуется использовать, так как он отображает в выводе имя задачи, которая была выполнена. Элемент apt – это встроенный модуль Ansible, который управляет пакетами в Debian-подобных дистрибутивах. Эта задача задаёт пакету vim состояние latest, что заставит менеджер пакетов установить этот пакет в случае, если он еще не установлен.

Формат плейбуков

Плейбуки – точка входа для оркестровки Ansible. Они содержат данные о системах, в которых будет происходить оркестровка, а также все директивы и команды, которые нужно выполнить. Ниже можно найти пример простого плейбука, который обновляет индекс пакетов и устанавливает vim:

---
- hosts: all
become: true
tasks:

- name: Update apt-cache
apt: update_cache=yes
- name: Install Vim
apt: name=vim state=latest

YAML сериализует структуры данных, потому очень важно проследить, чтобы все пробелы и абзацы были на месте.

Написание плейбука

Переменные

Ansible задаёт переменные несколькими способами. Самый простой из них – использование раздела vars самого плейбука. Ниже показано, как определить переменную package внутри задачи:

---
- hosts: all
become: true
vars:

package: vim

tasks:

- name: Install Package
apt: name={{ package }} state=latest

Переменная package доступна из любой точки оркестровки (даже в добавленных файлах и шаблонах).

Использование циклов

Циклы, как правило, используются для повторения задачи с помощью различных входных значений. То есть, вместо того чтобы создавать 10 задач для установки 10 различных пакетов, вы можете создать одну задачу и использовать цикл, чтобы  повторить задачу для установки любых пакетов, которые нужно установить.

Чтобы создать цикл в задаче, добавьте опцию with_items и массив значений. Доступ к контенту можно получить с помощью переменной item. Например:

- name: Install Packages
apt: name={{ item }} state=latest
with_items:

- vim
- git
- curl

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

---
- hosts: all
sudo: true
vars:

packages: [ 'vim', 'git', 'curl' ]

tasks:

- name: Install Package
apt: name={{ item }} state=latest
with_items: packages

Использование условных выражений

Условные выражения можно использовать для динамической настройки (например, когда на основе переменной или вывода команды нужно решить, следует ли выполнять задачу).

Ниже показан пример задачи, которая будет выполнена только в системах на основе Debian.

- name: Shutdown Debian Based Systems
command: /sbin/shutdown -t now
when: ansible_os_family == "Debian"

Условное выражение when принимает в качестве аргумента выражение, которое нужно оценить. Задача будет выполнена только в том случае, если выражение истинно (true).

Условные выражения часто используются в IT-автоматизации, если выполнение задачи зависит от вывода команды. В Ansible условные выражения внедряются путем добавления переменной для хранения результатов выполненной команды и проверки этой переменной в следующей задаче. Вы можете проверить состояние выхода команды (успешно она выполнена или нет) и наличие в нем конкретного фрагмента (хотя для этого может потребоваться использование регулярных выражений).

В приведённом ниже примере показаны две условные задачи, чьё выполнение зависит от вывода команды php –v. Данный код проверяет состояние вывода команды, поскольку она не будет выполнена в случае, если PHP не установлен на этот сервер. Раздел задачи ignore_errors позволяет продолжить оркестровку, даже если команду выполнить не удалось.

- name: Check if PHP is installed
register: php_installed
command: php -v
ignore_errors: true
- name: This task is only executed if PHP is installed
debug: var=php_install
when: php_installed|success
- name: This task is only executed if PHP is NOT installed
debug: msg='PHP is NOT installed'
when: php_installed|failed

Модуль debug позволяет просмотреть содержимое переменных или отладочные сообщения. Он может вывести строку (при использовании аргумента msg) или содержимое переменной (с помощью аргумента var).

Использование шаблонов

Шаблоны обычно используются в конфигурационных файлах и позволяют добавлять переменные и другие функции, которые делают эти файлы более универсальными и обеспечивают их повторное выполнение. Ansible использует механизм шаблонов Jinja2.

Ниже приведен пример шаблона для создания виртуального хоста Apache, в котором используется переменная для создания корневого каталога этого хоста:

<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot {{ doc_root }}
<Directory {{ doc_root }}>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>

Встроенный модуль template позволяет применить шаблон задачи. Если назвать файл шаблона в примере vhost.tpl и поместить его в один каталог с плейбуком, такой шаблон заменит виртуальный хост Apache по умолчанию:

- name: Change default Apache virtual host
template: src=vhost.tpl dest=/etc/apache2/sites-available/000-default.conf

Определение обработчиков

Обработчики изменяют состояние сервиса (например, останавливают или перезапускают его). Обработчики очень похожи на задачи, которые выполняются один раз и в том же порядке, в каком они определены; однако они выполняются только в том случае, если ранее в задаче срабатывает директива notify. Обработчики обычно определяются как массив в разделе плейбука handlers.

Рассмотрим предыдущий пример шаблона, который предназначен для создания виртуального хоста Apache. Чтобы обеспечить перезагрузку Apache после изменения виртуального хоста, нужно создать обработчик для этого сервиса. Это делается так:

handlers:
- name: restart apache
service: name=apache2 state=restarted
- name: other handler
service: name=other state=restarted

Директива name является уникальным идентификатором обработчика. Чтобы извлечь обработчик из задачи, используйте опцию notify.

- name: Change default Apache virtual host
template: src=vhost.tpl dest=/etc/apache2/sites-available/000-default.conf
notify: restart apache

Пример плейбука

Теперь можно собрать весь код данного руководства в один плейбук, который будет автоматизировать установку Apache в Ubuntu 14.04.

Примечание: Дополненный вариант плейбука можно найти на Github. Также эта папка содержит файл Vagrant, который позволяет протестировать плейбук на упрощённой установке с помощью виртуальной машины Vagrant.

---
- hosts: all
become: true
vars:

doc_root: /var/www/example

tasks:

- name: Update apt
apt: update_cache=yes
- name: Install Apache
apt: name=apache2 state=latest
- name: Create custom document root
file: path={{ doc_root }} state=directory owner=www-data group=www-data
- name: Set up HTML file
copy: src=index.html dest={{ doc_root }}/index.html owner=www-data group=www-data mode=0644
- name: Set up Apache virtual host file
template: src=vhost.tpl dest=/etc/apache2/sites-available/000-default.conf
notify: restart apache

handlers:

- name: restart apache
service: name=apache2 state=restarted

  • hosts: all: В начале плейбука указываются хосты, к которым его нужно применить, и в данном случае это все хосты. Вы можете также создавать индивидуальные плейбуки).
  • become: true: Этот фрагмент позволяет Ansible повысить привилегии для выполнения всех задач в плейбуке; можно устанавливать эту опцию для отдельных задач).
  • vars: В данном примере в задаче определяется переменная doc_root.
  • tasks: В этом разделе определяются все задачи данного плейбука; первая задача обновляет индекс пакетов, а вторая устанавливает пакет apache2. Третья задача использует встроенный модуль file (управляет файлами и каталогами), чтобы создать каталог document root. Четвёртая задача копирует локальный файл на удалённый сервер с помощью модуля copy (это простой HTML-файл, который Apache будет обслуживать как сртаницу сайта).
  • handlers: В этом разделе определяются сервисы. В четвёртой задаче используется обработчик restart apache.

Заключение

Ansible – это инструмент IT-автоматизации, который использует для оркестровки сценарии YAML. Он предоставляет огромное количество встроенных модулей, которые могут самостоятельно выполнять некоторые задачи (устанавливать пакеты, обрабатывать шаблоны и т.д.). Он упрощает работу с инфраструктурой, поскольку сам использует очень простой язык.

Tags: , ,

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>