Введение
В двух словах, управление конфигурацией сервера (также популярно известное как IT-автоматизация) – это решение для превращения администрирования вашей инфраструктуры в кодовую базу, описывающую все процессы, необходимые для развертывания сервера в наборе скриптов предоставления ресурсов, которые можно версионировать и легко повторно использовать. Это может значительно улучшить целостность любой серверной инфраструктуры со временем.
В предыдущем руководстве мы говорили о основных преимуществах внедрения стратегии управления конфигурацией для вашей серверной инфраструктуры, о том, как работают инструменты управления конфигурацией и что обычно общее у них.
Эта часть серии расскажет вам о процессе автоматизации предоставления сервера с использованием Ansible, инструмента управления конфигурацией, который предоставляет полноценный фреймворк автоматизации и возможности оркестрации, сохраняя цель абсолютной простоты и минимализма. Мы сосредоточимся на терминологии языка, синтаксисе и функциях, необходимых для создания упрощенного примера для полной автоматизации развертывания веб-сервера Ubuntu 18.04 с использованием Apache.
Следующий список содержит все шаги, которые нам нужно автоматизировать, чтобы достичь нашей цели:
- Обновить кэш
apt
- Установить Apache
- Создать пользовательский корневой каталог документа
- Разместите файл
index.html
в пользовательском корневом каталоге - Примените шаблон для настройки нашего пользовательского виртуального хоста
- Перезапустите Apache
Мы начнем с рассмотрения терминологии, используемой в Ansible, а затем перейдем к обзору основных функций языка, которые можно использовать для написания плейбуков. В конце руководства вы найдете содержание полного примера настройки для автоматизации шагов, описанных для установки Apache на Ubuntu 18.04.
Примечание: это руководство предназначено для ознакомления с языком Ansible и способами написания плейбуков для автоматизации настройки сервера. Для более вводного рассмотрения Ansible, включая необходимые шаги для установки и начала работы с этим инструментом, а также способы выполнения команд и плейбуков Ansible, ознакомьтесь с нашим руководством Как установить и настроить Ansible на Ubuntu 18.04.
Начало работы
Прежде чем мы перейдем к более практическому изучению Ansible, важно, чтобы мы познакомились с важной терминологией и концепциями, введенными этим инструментом.
Терминология
Следующий список содержит краткий обзор наиболее важных терминов, используемых в Ansible:
- Управляющий узел: машина, на которой установлен Ansible и отвечающая за выполнение настройки на управляемых вами серверах.
- Инвентарь: файл типа
INI
, содержащий информацию о серверах, которыми вы управляете. - Сценарий: файл типа
YAML
, содержащий серию процедур, которые должны быть автоматизированы. - Задача: блок, который определяет одну процедуру для выполнения, например: установка пакета.
- Модуль: модуль обычно абстрагирует системную задачу, такую как работа с пакетами или создание и изменение файлов. У Ansible есть множество встроенных модулей, но вы также можете создавать собственные.
- Роль: набор связанных сценариев, шаблонов и других файлов, организованных заранее определенным образом для облегчения повторного использования и обмена.
- Проигрывание: выполнение настройки от начала до конца называется проигрыванием.
- Факты: глобальные переменные, содержащие информацию о системе, такую как сетевые интерфейсы или операционная система.
- Обработчики: используются для вызова изменений статуса службы, таких как перезапуск или перезагрузка службы.
Формат задачи
A task defines a single automated step that should be executed by Ansible. It typically involves the usage of a module or the execution of a raw command. This is how a task looks:
- name: This is a task
apt: name=vim state=latest
Часть name
на самом деле является необязательной, но рекомендуется, так как она отображается в выводе при выполнении задачи. Часть apt
– это встроенный модуль Ansible, который абстрагирует управление пакетами в дистрибутивах на основе Debian. В этом примере задача сообщает Ansible, что пакету vim
должно быть изменено состояние на latest
, что приведет к установке этого пакета, если он еще не установлен.
Формат Playbook
Playbooks – это файлы YAML
, содержащие серию директив для автоматизации процесса предоставления сервера. В следующем примере простой playbook, выполняющий две задачи: обновление кэша apt
и установка vim
после этого:
---
- hosts: all
become: true
tasks:
- name: Update apt-cache
apt: update_cache=yes
- name: Install Vim
apt: name=vim state=latest
YAML
использует отступы для сериализации структур данных. Поэтому при написании playbooks, особенно при копировании примеров, необходимо быть особенно внимательным, чтобы сохранить правильный отступ.
Перед завершением этого руководства мы увидим более реальный пример playbook, подробно объясненный. В следующем разделе вы получите обзор наиболее важных элементов и функций, которые можно использовать для написания playbook’ов Ansible.
Написание Playbooks
Теперь, когда вы знакомы с основными терминами и общим форматом плейбуков и задач в Ansible, мы узнаем о некоторых функциях плейбуков, которые могут помочь нам создавать более гибкие автоматизации.
Работа с переменными
Существует несколько способов определения переменных в 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
become: true
vars:
packages: [ 'vim', 'git', 'curl' ]
tasks:
- name: Install Package
apt: name={{ item }} state=latest
with_items: "{{ packages }}"
Использование условий
Условия могут использоваться для динамического решения, следует ли выполнить задачу, основываясь на переменной или выводе из команды, например.
В следующем примере будет выполнено выключение систем на основе Debian:
Условие when
принимает в качестве аргумента выражение для оценки. Задача выполняется только в том случае, если выражение оценивается как true
. В нашем примере мы проверяем факт, чтобы убедиться, что операционная система принадлежит семейству Debian.
A common use case for conditionals in IT automation is when the execution of a task depends on the output of a command. With Ansible, the way we implement this is by registering a variable to hold the results of a command execution, and then testing this variable in a subsequent task. We can test for the command’s exit status (if failed or successful). We can also check for specific contents inside the output, although this might require the usage of regex expressions and string parsing commands.
Следующий пример показывает две условные задачи на основе вывода команды php -v
. Мы будем проверять код завершения команды, так как мы знаем, что она не выполнится в случае, если PHP не установлен на этом сервере. Важно использовать часть ignore_errors
задачи, чтобы убедиться, что процесс продолжится даже в случае ошибки выполнения команды.
Модуль 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:
Определение и вызов обработчиков
Обработчики используются для вызова изменения состояния службы, такого как перезапуск или остановка. Хотя они могут выглядеть довольно похожими на обычные задачи, обработчики выполняются только при предварительном вызове из директивы notify
в задаче. Они обычно определяются как массив в разделе handlers
сценария, но могут также находиться в отдельных файлах.
Давайте рассмотрим наш предыдущий пример использования шаблона, где мы настраивали виртуальный хост Apache. Если вы хотите убедиться, что Apache перезапускается после изменения виртуального хоста, сначала вам нужно создать обработчик для службы Apache. Вот как обработчики определяются внутри сценария:
Директива name
здесь важна, потому что она будет уникальным идентификатором этого обработчика. Чтобы вызвать этот обработчик из задачи, вы должны использовать опцию notify
:
Мы рассмотрели некоторые из наиболее важных функций, которые вы можете использовать для начала написания плейбуков Ansible. В следующем разделе мы погрузимся в более реальный пример плейбука, который автоматизирует установку и настройку Apache на Ubuntu.
Пример плейбука
Теперь давайте посмотрим на плейбук, который автоматизирует установку веб-сервера Apache в системе Ubuntu 18.04, как обсуждалось во введении данного руководства.
Полный пример, включая файл шаблона для настройки Apache и HTML-файл для обслуживания веб-сервером, можно найти на Github. Папка также содержит файл Vagrantfile, который позволяет вам протестировать плейбук в упрощенной настройке, используя виртуальную машину, управляемую 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
-
Давайте рассмотрим каждый раздел этого плейбука более подробно:
хосты: все
Плейбук начинается с указания, что он должен применяться ко всем хостам в вашем инвентаре (хосты: все
). Возможно ограничить выполнение плейбука только для определенного хоста или группы хостов. Эту опцию можно переопределить во время выполнения.
стать: да
Часть стать: да
указывает Ansible использовать повышение привилегий (sudo) для выполнения всех задач в этом плейбуке. Эту опцию можно переопределить для каждой задачи по отдельности.
переменные
Определяет переменную doc_root
, которая затем используется в задаче. В этом разделе могут быть определены несколько переменных.
задачи
Раздел, где определяются фактические задачи. Первая задача обновляет кэш apt
, а вторая задача устанавливает пакет apache2
.
Третья задача использует встроенный модуль file для создания каталога, который будет служить нашим корневым документом. Этот модуль можно использовать для управления файлами и каталогами.
Четвертая задача использует модуль copy для копирования локального файла на удаленный сервер. Мы копируем простой HTML-файл, который будет представлять собой наш веб-сайт, размещаемый Apache.
обработчики
Наконец, у нас есть раздел обработчики
, где объявлены сервисы. Мы определяем обработчик перезапустить apache
, который уведомляется из четвертой задачи, где применяется шаблон Apache.
Запуск Playbook
После того как вы загрузили содержимое этого playbook на ваш управляющий узел Ansible, вы можете использовать ansible-playbook
для его выполнения на одном или нескольких узлах из вашего инвентарного файла. Следующая команда выполнит playbook на всех хостах из вашего файла инвентаря по умолчанию, используя аутентификацию по ключам SSH для подключения в качестве текущего пользователя системы:
Вы также можете использовать -l
для ограничения выполнения на один хост или группу хостов из вашего инвентаря:
Если вам нужно указать другого пользователя SSH для подключения к удаленному серверу, вы можете включить аргумент -u пользователь
в эту команду:
Для получения дополнительной информации о том, как выполнять команды и playbook’и Ansible, обратитесь к нашему руководству по Как установить и настроить Ansible на Ubuntu 18.04.
Заключение
Ansible – это минималистичный инструмент для автоматизации ИТ-процессов с низким порогом входа, использующий YAML для своих скриптов предоставления. У него есть большое количество встроенных модулей, которые можно использовать для абстрагирования задач, таких как установка пакетов и работа с шаблонами. Его упрощенные требования к инфраструктуре и простой язык могут быть хорошим выбором для тех, кто только начинает работу с управлением конфигурациями. Однако у него может отсутствовать некоторые расширенные функции, которые можно найти в более сложных инструментах, таких как Puppet и Chef.
В следующей части этой серии мы рассмотрим практический обзор Puppet, популярного и хорошо установленного инструмента управления конфигурациями, который использует выразительный и мощный собственный DSL на основе Ruby для написания скриптов предоставления.