Поиск по сайту:

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


Введение

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

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

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

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

  1. Обновите кеш apt
  2. Установите Apache
  3. Создать собственный корневой каталог документа
  4. Поместите файл index.html в корневой каталог пользовательского документа.
  5. Применить шаблон для настройки собственного виртуального хоста
  6. Перезапустите Apache

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

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

Начиная

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

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

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

  • Узел управления: компьютер, на котором установлен Ansible, отвечающий за выполнение подготовки на серверах, которыми вы управляете.
  • Inventory: файл INI, содержащий информацию о серверах, которыми вы управляете.
  • Playbook: файл YAML, содержащий ряд процедур, которые следует автоматизировать.
  • Задача: блок, определяющий одну выполняемую процедуру, например: установить пакет.
  • Модуль: модуль обычно абстрагирует системную задачу, например работу с пакетами или создание и изменение файлов. Ansible имеет множество встроенных модулей, но вы также можете создавать собственные.
  • Роль: набор связанных плейбуков, шаблонов и других файлов, организованных заранее определенным образом для облегчения повторного использования и совместного использования.
  • Воспроизведение: подготовка, выполняемая от начала до конца, называется воспроизведением.
  • Факты: глобальные переменные, содержащие информацию о системе, например о сетевых интерфейсах или операционной системе.
  • Обработчики: используются для инициирования изменений состояния службы, таких как перезапуск или перезагрузка службы.

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

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

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

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

Формат сборника игр

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.

Написание учебников

Теперь, когда вы знакомы с базовой терминологией и общим форматом плейбуков и задач в 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

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

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

Содержание учебника

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

  1. ---
  2. - hosts: all
  3. become: true
  4. vars:
  5. doc_root: /var/www/example
  6. tasks:
  7. - name: Update apt
  8. apt: update_cache=yes
  9. - name: Install Apache
  10. apt: name=apache2 state=latest
  11. - name: Create custom document root
  12. file: path={{ doc_root }} state=directory owner=www-data group=www-data
  13. - name: Set up HTML file
  14. copy: src=index.html dest={{ doc_root }}/index.html owner=www-data group=www-data mode=0644
  15. - name: Set up Apache virtual host file
  16. template: src=vhost.tpl dest=/etc/apache2/sites-available/000-default.conf
  17. notify: restart apache
  18. handlers:
  19. - name: restart apache
  20. service: name=apache2 state=restarted

Давайте рассмотрим каждую часть этой книги более подробно:

хозяева: все

становятся истинными

вары

задания

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

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

обработчики

Запуск Playbook

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

  1. ansible-playbook playbook.yml

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

  1. ansible-playbook -l host_or_group playbook.yml

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

  1. ansible-playbook -l host_or_group playbook.yml -u remote-user

Для получения дополнительной информации о том, как запускать команды Ansible и playbook, обратитесь к нашему руководству «Как установить и настроить Ansible в Ubuntu 18.04».

Заключение

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

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