Infobox corporate blog
January 2015 29

Автоматизируем и ускоряем процесс настройки облачных серверов с 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 проверяет наличие файла конфигурации в следующих расположениях:
  1. Проверяется переменная окружения ANSIBLE_CONFIG, которая может указывать на файл конфигурации.
  2. ./ansible.cfg – в текущей директории
  3. ~/.ansible.cfg — в домашней директории
  4. /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 --list-host, где – путь к вашему playbook (playbooks/setup_nginx.yml).

    tasks: Задачи. Все playbooks содержат задачи. Задача — это список действий, которые вы хотите выполнить. Поле задачи содержит имя задачи (справочная информация о задаче для пользователя playbook), модуль, который должен быть выполнен и аргументы, требуемые для модуля. Параметр «name» опциональный, но рекомендуемый.


  • Успешной работы!

+22
67.9k 272
Comments 32
Top of the day