Автоматизируем и ускоряем процесс настройки облачных серверов с Ansible. Часть 1: Введение
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
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 для освещения в последующих статьях. Ссылки на следующие статьи будут добавлены в конец этой статьи, поэтому можно просто сохранить ее на будущее.
Успешной работы!