Управление конфигурацией 101: написание Ansible Playbooks

Вступление

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

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

В этой части серии вы узнаете, как автоматизировать подготовку серверов с помощью Ansible, инструмента управления конфигурацией, который предоставляет полную инфраструктуру автоматизации и возможности оркестровки, сохраняя при этом цель максимальной простоты и минимализма. Мы сосредоточимся на терминологии языка, синтаксисе и функциях, необходимых для создания упрощенного примера для полной автоматизации развертывания веб-сервера Ubuntu 18.04 с использованием Apache.

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

  1. Обновите кеш + apt +

  2. Установите Apache

  3. Создать пользовательский корневой каталог документов

  4. Поместите файл + index.html в пользовательский корень документа

  5. Примените шаблон для настройки нашего собственного виртуального хоста

  6. Перезапустите Apache

Мы начнем с изучения терминологии, используемой Ansible, а затем кратко рассмотрим основные возможности языка, которые можно использовать для написания пьес. В конце руководства вы найдете содержание полного примера обеспечения, чтобы автоматизировать шаги, описанные для настройки Apache в Ubuntu 18.04.

Начиная

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

терминология

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

  • * Control Node *: компьютер, на котором установлен Ansible, ответственный за запуск инициализации на серверах, которыми вы управляете.

  • * Inventory *: файл + INI +, содержащий информацию о серверах, которыми вы управляете.

  • * Playbook *: файл + YAML +, содержащий серию процедур, которые должны быть автоматизированы.

  • * Задача *: блок, который определяет одну процедуру, которая будет выполнена, например: установить пакет.

  • * Модуль *: модуль обычно абстрагирует системную задачу, такую ​​как работа с пакетами или создание и изменение файлов. Ansible имеет множество встроенных модулей, но вы также можете создавать собственные.

  • * Роль *: набор связанных плейбуков, шаблонов и других файлов, организованных заранее определенным способом для облегчения повторного использования и обмена.

  • * Play *: инициализация, выполняемая от начала до конца, называется play.

  • * Факты *: глобальные переменные, содержащие информацию о системе, например, о сетевых интерфейсах или операционной системе.

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

Формат задачи

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

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

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

Playbook Format

Playbooks - это файлы + YAML +, содержащие серию директив для автоматизации предоставления сервера. Следующий пример - простая книга воспроизведения, которая выполняет две задачи: обновляет кеш + apt + и впоследствии устанавливает + vim +:

---
- hosts: all
 become: true
 tasks:
    - name: Update apt-cache
      apt: update_cache=yes

    - name: Install Vim
      apt: name=vim state=latest

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

Перед окончанием этого руководства мы увидим более реалистичный пример сборника, подробно объясненный. В следующем разделе представлен обзор наиболее важных элементов и функций, которые можно использовать для написания сборников пьес 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:

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

Условное + when + получает в качестве аргумента выражение для оценки. Задача выполняется только в том случае, если выражение оценивается как + true +. В нашем примере мы протестировали * факт *, чтобы проверить, относится ли операционная система к семейству Debian.

Обычный вариант использования условных вычислений в ИТ-автоматизации - это когда выполнение задачи зависит от вывода команды. В 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

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

Обработчики используются для запуска изменения состояния в службе, такой как restart или stop. Несмотря на то, что они могут выглядеть довольно похоже на обычные задачи, обработчики выполняются только при предварительном запуске из директивы + notify + в задаче. Они обычно определяются как массив в разделе + handlers + книги, но они также могут находиться в отдельных файлах.

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

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

Мы видели некоторые из наиболее важных функций, которые вы можете использовать, чтобы начать писать книги-пьесы Ansible. В следующем разделе мы рассмотрим более реалистичный пример книги, которая автоматизирует установку и настройку Apache в Ubuntu.

Пример Playbook

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

Полный пример, включая файл шаблона для настройки Apache и файл HTML, который будет обслуживаться веб-сервером, можно найти по адресу on Github. Папка также содержит Vagrantfile, который позволяет вам тестировать playbook в упрощенной настройке, используя виртуальную машину, управляемую https://vagrantup.com [Vagrant].

Содержание Playbook

Полное содержание книги доступно для вашего удобства:

playbook.yml

---
- 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 * + Playbook начинается с того, что его нужно применить к + all + хостам в вашем инвентаре (+ hosts: all +). Можно ограничить выполнение пьесы определенным хостом или группой хостов. Эта опция может быть перезаписана во время выполнения.

  • становиться: истинным * + Часть + становиться: истинным + говорит Ansible использовать повышение привилегий (sudo) для выполнения всех задач в этой книге. Эта опция может быть перезаписана в зависимости от задачи.

  • vars * + Определяет переменную + doc_root +, которая позже используется в задаче. Этот раздел может содержать несколько переменных.

  • задачи * + Раздел, в котором определены актуальные задачи. Первая задача обновляет кэш + apt +, а вторая задача устанавливает пакет + apache2 +.

Третье задание использует встроенный модуль * file * для создания каталога, который будет служить корневым каталогом нашего документа. Этот модуль можно использовать для управления файлами и каталогами.

Четвертое задание использует модуль * copy * для копирования локального файла на удаленный сервер. Мы копируем простой HTML-файл, который будет служить нашим веб-сайтом, размещенным на Apache.

  • handlers * + Наконец, у нас есть раздел + handlers +, где объявляются сервисы. Мы определяем обработчик + restart apache +, который получает уведомление от четвертой задачи, где применяется шаблон Apache.

Запуск Playbook

После того, как вы получите содержимое этой книги воспроизведения на свой управляющий узел Ansible, вы можете использовать + ansible-playbook +, чтобы выполнить его на одном или нескольких узлах из вашего инвентаря. Следующая команда выполнит playbook на * всех * хостах из файла инвентаризации по умолчанию, используя аутентификацию SSH по ключевой паре для подключения в качестве текущего пользователя системы:

ansible-playbook playbook.yml

Вы также можете использовать + -l +, чтобы ограничить выполнение одним хостом или группой хостов из вашего инвентаря:

ansible-playbook -l  playbook.yml

Если вам нужно указать другого пользователя SSH для подключения к удаленному серверу, вы можете включить аргумент + -u + в эту команду:

ansible-playbook -l  playbook.yml -u

Для получения дополнительной информации о том, как запускать команды и игровые книги Ansible, см. Наше руководство по адресу https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-ansible-on-ubuntu-18- 04 [Как установить и настроить Ansible в Ubuntu 18.04].

Заключение

Ansible - это минималистский инструмент автоматизации ИТ, имеющий низкую кривую обучения, использующий + YAML + для своих сценариев обеспечения. Он имеет множество встроенных модулей, которые можно использовать для абстрагирования таких задач, как установка пакетов и работа с шаблонами. Его упрощенные требования к инфраструктуре и простой язык могут хорошо подойти тем, кто только начинает работать с управлением конфигурациями. Однако в нем могут отсутствовать некоторые расширенные функции, которые можно найти с помощью более сложных инструментов, таких как Puppet и Chef.

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

Related