Ansible – популярный инструмент для автоматизации настройки и развертывания ИТ-инфраструктуры.
Основные задачи, которые решает Ansible:
- Управление конфигурациями. Максимально быстрая и правильная настройка серверов до описанной конфигурации.
- Провижнинг. Управление процессом развертывания новых облачных серверов (например через API, с помощью Docker или LXC).
- Развертывание. Инсталляция и обновление ваших приложений без простоя наилучшим образом.
- Оркестрация. Координация компонентов вашей инфраструктуры для выполнения развертываний. Например проверка, что веб-сервер отключен от балансировщика нагрузки, до апгрейда ПО на сервере.
- Мониторинг и уведомления.
- Логгирование. Централизованный сбор логов.
По сравнению с другими популярными инструментами автоматизации ит-инфраструктуры, Ansible не требует установки клиентских приложений на обслуживаемые сервера, что может сократить время настройки перед развертыванием инфраструктуры. Для работы Ansible подключается к обслуживаемым серверам по SSH.
Важность подобных инструментов только увеличивается в облаке с появлением возможности быстро создавать необходимые сервера, развертывать необходимое ПО, использовать и удалять, когда необходимость отпала, оплачивая только используемые ресурсы. В нашей статье мы рассмотрим основную функциональность Ansible в контексте практического использования на облачных серверах в InfoboxCloud.
Что нам потребуется для настройки
Мы надеемся, что у вас уже есть учетная запись в InfoboxCloud. Если еще нет — создайте ее.
Для работы Ansible нам понадобится управляющий сервер. Создайте его (рекомендуется использовать Ubuntu 14.04 или CentOS 7). Также создайте как минимум пару серверов с Linux, которые и будут настраиваться с помощью Ansible. Данные для доступа к серверам будут отправлены на ваш email.
Подключитесь к управляющему серверу по SSH.
Установка Ansible
Ubuntu 14.04 LTS
Для установки, на управляющем сервере введите:
apt-key update && apt-get update && apt-get -y upgrade && apt-get -y install python-software-properties && apt-get -y install software-properties-common && apt-add-repository -y ppa:rquillo/ansible && apt-get update && apt-get -y install ansible
CentOS 7
Для установки, на управляющем сервере введите:
yum -y update && yum -y install epel-release && yum -y install ansible
Как работает Ansible
Основная идея Ansible – наличие одного или нескольких управляющих серверов, из которых вы можете отправлять команды или наборы последовательных инструкций (playbooks) на удаленные сервера, подключаясь к ним по SSH.
Файл Host inventory содержит информацию об обслуживаемых серверах, где команды будут исполнены. Файл конфигурации Ansible может быть полезен для указания настроек вашего окружения.
Наборы инструкций (playbooks) состоят из одной или более задач, которые описываются с помощью функциональность модуля ядра Ansible или сторонних модулей, которые могут потребоваться в специфических ситуациях. Сами по себе наборы инструкций — последовательные наборы команд, в которых могут быть проверки условий: если условие не выполняется, определенные команды могут пропускаться.
Также вы можете использовать Ansible API для запуска скриптов. Если скрипту-обертке (wrapper) может потребоваться запуск playbook, это можно сделать через API. Сами playbooks описываются декларативно в формате YAML. Ansible поддерживает сценарии развертывания новых облачных серверов и конфигурирования их на основании ролей. Часть работы может быть проведена в локальном режиме на управляющем сервере, а остальная — на созданном сервере после его первой загрузки. Ведется работа над модулем провижнинга для InfoboxCloud.
Настройка Ansible
Файл конфигурации описывается в INI–формате. Вы можете переопределить часть или всю конфигурацию в параметрах playbook или переменных окружения.
При исполнении команд Ansible проверяет наличие файла конфигурации в следующих расположениях:
- Проверяется переменная окружения ANSIBLE_CONFIG, которая может указывать на файл конфигурации.
- ./ansible.cfg – в текущей директории
- ~/.ansible.cfg — в домашней директории
- /etc/ansible/ansible.cfg — в каталоге, сгенерированном при установке ansible через менеджер пакетов.
Настройка через переменные окружения
Большинство параметров конфигурации можно установить через переменные окружения, используя префикс ANSIBLE_ перед названием параметра конфигурации (большими буквами).
Например:
export ANSIBLE_SUDO_USER=root
После этого переменная ANSIBLE_SUDO_USER может быть использована в playbook.
Настройка в ansible.cfg
Параметров конфигурации Ansible множество. Давайте рассмотрим некоторые из них:
- hostfile: Параметр указывает на путь к inventory file, в котором содержится список адресов хостов, к которым Ansible может подключиться.
Например: hostfile = /etc/ansible/hosts - library: Путь к директории, где хранятся модули Ansible. Например: library = /usr/share/ansible
- forks: Количество процессов, которые может породить Ansible. По-умолчанию установлено 5 процессов.
Например: forks = 5 - sudo_user: Пользователь по умолчанию, от которого Ansible запускает команды на удаленных серверах.
Например: sudo_user = root - remote_port: Порт для соединения по SSH (по умолчанию 22).
Например: remote_port = 22 - host_key_checking: Параметр позволяет отключить проверку SSH–ключа на хосте. По-умолчанию проверка выполняется.
Например: host_key_checking = False - timeout: Значение таймаута попытки подключения по SSH.
Например: timeout = 60 - log_path: Путь для хранения файлов логов. По-умолчанию Ansible не хранит их совсем, но указав этот параметр можно активировать запись логов.
Например: log_path = /var/log/ansible.log
Пишем первый файл конфигурации Ansible
Давайте создадим наш первый файл конфигурации Ansible в InfoboxCloud. Подключитесь по SSH к созданному управляющему серверу с установленным Ansible. Создайте директорию для наших экспериментов 'ansible' и перейдите в нее:
mkdir ~/ansible
cd ~/ansible
Также создайте папку для хранения модулей Ansible и папку для хранения логов:
mkdir ~/ansible/modules
mkdir ~/ansible/logs
Создайте файл ansible.cfg со следующим содержимым:
[defaults]
hostfile = ~/ansible/inventory
sudo_user = root
log_path = ~/ansible/logs/ansible.log
Указываем обслуживаемые сервера в host inventory
Для экспериментов ранее мы создали пару серверов, которые и будем настраивать. Нужно сообщить Ansible их адреса и сгруппировать их. Для этого создайте файл inventory нашей директории ~/ansible/inventory со следующим содержимым:
[experiments]
ip_первой_машины
ip_второй_машины
ip_адреса серверов можно посмотреть в панели управления InfoboxCloud.
Обратите внимание, что для использования управляющего сервера Ansible с серверами в одном регионе можно указать локальные IP–адреса и работать по внутренней сети.
Необходимо сгенерировать на управляющем сервере ключ, который будет использоваться для доступа к настраиваемым серверам.
Это делается с помощью команды:
ssh-keygen
На все вопросы можно просто нажать Enter.
Теперь необходимо скопировать публичный ключ на настраиваемые сервера. Это можно сделать с помощью утилиты ssh-copy-id с управляющего сервера Ansible для каждого настраиваемого сервера:
ssh-copy-id root@ip_адрес_настраиваемого_сервера
Проверить корректность можно, залогинившись в настраиваемый сервер с управляющего по SSH. Если пароль больше не спрашивается — все в порядке.
В InfoboxCloud можно создавать новые сервера с уже указанным публичным ключом. Для этого создайте чистый сервер. Скопируйте на него публичный SSH-ключ, как показано выше. Далее создайте образ ОС:
Теперь в разделе «Образы серверов» панели управления можно при необходимости нажать «Создать сервер» на нашем образе и получить готовую к конфигурации машину для Ansible.
Давайте теперь проверим корректность настройки Ansible полностью.
Можно попинговать обслуживаемые сервера:
ansible experiments -m ping
или отправить в echo «Hello World»:
ansible experiments -a "/bin/echo Hello, World!"
Управление конфигурациями
Работаем с playbooks
Исполнение Playbooks – одна из основных задач Ansible. Playbooks содержат списки задач. Каждая задача внутри Ansible использует кусок кода-модуля. Сами Playbooks описываются в формате YAML, но модули могут быть написаны на любом языке программирования. Важно, чтобы формат сообщений от модулей был в JSON.
YAML
Playbook пишется на YAML. Давайте посмотрим на основные правила написания YAML-файлов.
Для Ansible практически каждый YAML файл начинается со списка. Каждый элемент списка — список пар «ключ-значение», часто называемая словарем.
Все YAML файлы должны начинаться с "---". Это часть формата YAML и означает начало документа.
Все члены списка должны находится с одинаковым отступом от начала строки, и должны начинаться с пробела или "-". Комментарии начинаются с "#".
Например:
---
#Message
- Hosting
– Cloud
Словарь представлен в виде «ключ:» (двоеточие и пробел) «значение»:
---
#Message
site: habr
blog: infobox
При необходимости словари могут быть представлены в сокращенной форме:
---
#Comment
{site: habr, blog: infobox}
Можно указать логические значение (истина/ложь) так:
---
need_access: no
use_service: yes
file_conf: TRUE
read_value: True
kill_process: false
Целиком наш пример YAML–файла будет выглядеть так:
---
#About blog
site: habr
blog: infobox
must_read: True
themes:
- hosting
- cloud
- it
- geeks
brands:
- infobox
- infoboxcloud
Для переменных Ansible использует "{{ var }}". Если значение после двоеточия начинается с "{", то YAML будет думать, что это словать.
Для использования переменных нужно заключить скобки в кавычки:
word: "{{ variable }}"
Этого достаточно для начала написания playbooks.
Пишем наш первый playbook
Playbooks может состоять из списка обслуживаемых серверов, переменных пользователя, задач, обработчиков (хендлеров) и т.д. Большинство настроек конфигурации можно переопределить в playbook. Каждый playbook состоит из одного или более действия (игры) в списке.
Цель игры — связать группу хостов с предопределенными ролями, представленными как вызов задач Ansible.
В качестве примера давайте рассмотрим процесс установки nginx.
Создадим директорию, где будут хранится playbooks:
mkdir ~/ansible/playbooks
Создадим файл setup_nginx.yml в директории playbooks со следующим содержанием:
---
- hosts: experiments
tasks:
- name: Install nginx package
apt: name=nginx update_cache=yes
sudo: yes
- name: Starting nginx service
service: name=nginx state=started
sudo: yes
Давайте рассмотрим содержимое:
- hosts: Список хостов или группа, на которой вы запускаете задачу. Это поле обязательное и каждый playbook должен иметь его, за исключением ролей. Если указана хост-группа, сначала Ansible ее ищет в playbook, а затем в файле inventory. Узнать, на каких хостах будет происходить работа, можно командой:
ansible-playbook <playbook> --list-host
, где – путь к вашему playbook (playbooks/setup_nginx.yml). - tasks: Задачи. Все playbooks содержат задачи. Задача — это список действий, которые вы хотите выполнить. Поле задачи содержит имя задачи (справочная информация о задаче для пользователя playbook), модуль, который должен быть выполнен и аргументы, требуемые для модуля. Параметр «name» опциональный, но рекомендуемый.
Остальные параметры конфигурации, такие, как remote_user, берутся из ansible.cfg.
При исполнении playbook мы используем 2 модуля: apt и service. В первом мы указываем, что нужно выполнить apt-get update до установки nginx, во втором указываем название процесса и состояние, которое должен получить процесс. Так же указано, что необходимы права суперпользователя для обоих задач.
Ansible не поддерживает единое описание менеджера пакетов для всех дистрибутивов, т.к. способ их работы и название самих пакетов в различных дистрибутивах может отличаться (например Apache в CentOS 7 называется httpd, а в Ubuntu 14.04: apache2). Текущий менеджер пакетов ОС содержится в переменной ansible_package_manager.
Запустите playbook из директории ~/ansible:
cd ~/ansible
ansible-playbook playbooks/setup_nginx.yml
Убедитесь, что nginx корректно установлен на оба сервера.
Поздравляем! Вы успешно запустили свой первый playbook!
В следующей статье мы проведем разбор вывода этого playbook и продолжим изучение Ansible.
Заключение
При изучении Ansible полезной будет книга "Learning Ansible" и конечно официальная документация.
Вы можете получить пробную версию InfoboxCloud для экспериментов с Ansible. Для этого пришлите нам ваш email, имя и фамилию. Мы предоставим бесплатную пробную версию облака на 15 дней.
Если вы обнаружили ошибку в статье, автор ее с удовольствием исправит. Пожалуйста напишите в ЛС или на почту о ней. Туда же можно задавать вопросы по Ansible для освещения в последующих статьях. Ссылки на следующие статьи будут добавлены в конец этой статьи, поэтому можно просто сохранить ее на будущее.
Успешной работы!
Автор: infobox