MyTetra Share
Делитесь знаниями!
Создание плейбука Ansible
Время создания: 27.11.2019 10:30
Раздел: Компьютер - Linux - Оркестрация - Ansible
Запись: xintrea/mytetra_syncro/master/base/1574839834ai3jzpr7io/text.html на raw.github.com

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

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

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


Внимение! Все примеры конфигураций в этой статье имеют нарушенную структуру отступов. При воспроизведении примеров нужно учитывать синтаксис YAML.


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

Прежде чем приступить к разработке плейбука, нужно ознакомиться с основными терминами 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. Он предоставляет огромное количество встроенных модулей, которые могут самостоятельно выполнять некоторые задачи (устанавливать пакеты, обрабатывать шаблоны и т.д.). Он упрощает работу с инфраструктурой, поскольку сам использует очень простой язык.


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования