IT Blog
  • Home
  • About
  • Categories
  • Tags
  • Archives

Ansible Introduction. Part 1

Ansible

Содержание

  • Введение
    • Основные задачи
    • Плюсы Ansible
  • Установка
  • Как работает Ansible
  • Настройка Ansible
    • Настройка через переменные окружения
    • Создание конфигурационного файла
    • Настройка ansible.cfg
    • Файл host inventory
      • Переменные в inventory–файле
      • Переменные в отдельном файле для inventory
    • Факты
  • Примеры простых задач
  • Список источников

Введение

Ansible - система управления конфигурациями, написанная на Python, с использованием декларативного языка разметки для описания конфигураций. Используется для автоматизации настройки и развертывания программного обеспечения.

Ansible - берет на себя всю работу по приведению удаленных серверов в необходимое состояние. Администратору необходимо лишь описать, как достичь этого состояния с помощью так называемых сценариев (playbooks; это аналог рецептов Chef). Такая технология позволяет очень быстро осуществлять переконфигурирования системы: достаточно всего лишь добавить несколько новых строк в сценарий.

Основные задачи

Основные задачи, которые решает Ansible:

  • Управление конфигурациями. Максимально быстрая и правильная настройка серверов до описанной конфигурации.
  • Провижнинг. Управление процессом развертывания новых облачных серверов (например через API, с помощью Docker или LXC).
  • Развертывание. Инсталляция и обновление ваших приложений без простоя наилучшим образом.
  • Оркестрация. Координация компонентов вашей инфраструктуры для выполнения развертываний. Например проверка, что веб-сервер отключен от балансировщика нагрузки, до апгрейда ПО на сервере.
  • Мониторинг и уведомления.
  • Логгирование. Централизованный сбор логов.

Плюсы Ansible

Преимущества Ansible по сравнению с другими аналогичными решениями (Puppet, Chef и Salt) заключается в следующем:

  • на управляемые узлы не нужно устанавливать никакого дополнительного ПО, всё работает через SSH (в случае необходимости дополнительные модули можно взять из официального репозитория);
  • код программы, написанный на Python, очень прост; при необходимости написание дополнительных модулей не составляет особого труда;
  • язык, на котором пишутся сценарии, также предельно прост;
  • низкий порог вхождения: обучиться работе с Ansible можно за очень короткое время;
  • документация к продукту написана очень подробно и вместе с тем — просто и понятно; она регулярно обновляется;
  • Ansible работает не только в режиме push, но и pull, как это делают большинство систем управления (Puppet, Chef);
  • имеется возможность последовательного обновления состояния узлов (rolling update).

Установка

Требования для установки Ansible минимальны. На машине с которой производится управления должен быть установлен Python 2.6 или выше. На управляемых узлах должен быть установлен только Python версии не ниже 2.4, но он, как правило, по умолчанию включен в состав большинства дистрибутивов linux-систем.

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

  • paramiko;
  • PyYAML;
  • jinja2.

Установка Ansible в Ubuntu:

sudo add-apt-repository -y ppa:rquillo/ansible
sudo apt-get update
sudo apt-get install ansible -y

Установка Ansible в CentOS 7:

sudo rpm -iUvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
sudo yum -y update
sudo yum -y install ansible

Остальные варианты и способы установки описаны в документации.


Как работает Ansible

Основная идея - наличие одного или нескольких управляющих серверов, из которых можно отправлять команды или наборы последовательных инструкций (playbooks) на удаленные сервера, подключаясь к ним по SSH.

Ansible Architecture

Файл Host inventory (инвентарный файл)содержит информацию об обсуживаемых серверах, где команды будут исполнены. Файл конфигурации Ansible может быть полезен для указания настроек вашего окружения.

Наборы инструкций (playbooks) состоят из одной или более задач, которые описываются с помощью функциональности модуля ядра Ansible или сторонних модулей, которые могут потребоваться в специфических ситуациях. Сами по себе наборы инструкций - последовательные наборы команды, в которых могут быть проверки условий: если условие не выполняется, определенные команды могут пропускаться.

Так же можно использовать Ansible API для запуска скриптов. Если скрипту-обертке (wrapper) может потребоваться запуск playbook, это можно сделать через API. Сами playbooks описываются декларативно в формате YAML. Ansible поддерживает сценарии развертывания новых облачных серверов и конфигурирования их на основании ролей. Часть работы может быть проведена в локальном режиме на управляющем сервере, а остальная - на созданном сервере после его первой загрузки.


Настройка Ansible

Файл конфигурации описывается в INI-формате. Можно переопределить часть или всю конфигурацию в параметрах playbook или переменные окружения. При исполнении команд Ansible проверяет наличие файла конфигурации в следующих расположениях:

  1. Проверяется переменная окружения ANSIBLE_CONFIG, которая может указывать на файл конфигурации.
  2. ./ansible.cfg - в текущей директории
  3. ~/.ansible.cfg - в домашней директории
  4. /etc/ansible/ansible.cfg

Настройка через переменные окружения

Большинство параметров конфигурации можно устанавливать через переменные окружения, используя префикс ANSIBLE_ перед названием параметра конфигурации (большими буквами).

Например, export ANSIBLE_SUDO_USER=root

После этого переменная ANSIBLE_SUDO_USER может использована в playbook.

Создание конфигурационного файла

Создаем директорию, для примера - 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

Настройка 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

Файл host inventory

Дефолтное расположение файла - /etc/ansible/hosts, но оно может также быть задано параметром окружения $ANSIBLE_HOSTS или параметром -i при запуске ansible и ansible-playbook. Содержимое этого файла может выглядеть, например, так (в квадратных скобках указаны имена групп управляемых узлов, ниже перечисляются входящие в эти группы серверы):

[dbservers]
one.example.com
two.example.com
three.example.com

[dnsservers]
rs1.example.com ansible_ssh_port=1234 ansible_ssh_host=192.168.1.10
rs2.example.com

Если у есть большое количество серверов, использование соглашений о наименовании (например web001, web002 ... web00N) позволит проще указывать их в inventory. Можно использовать регулярные выражения в inventory файле:

[web]
web[001:200]
[db]
db[001:020]
[balancer]
192.168.2.[1:3]

, где web[001:200] будет соответствовать web 001, web002, web003, web004, ..., web199, web200 для группы web; db[001:020] будет соответствовать db001, db002, db003 ..., db019, db020 для группы db; 192.168.2.[1:3] будет соответствовать 192.168.2.1, 192.168.2.2, 192.168.2.3 для группы balancer.

Помимо списка управляемых узлов, в файле hosts могут быть указаны и другие сведения, необходимые для работы: номера портов для подключения по SSH, способ подключения, пароль для подключения по SSH, имя пользователя, объединения групп и т.п.

По структуре инвентарного файла: Ansible считает группой все, чья строка в описании начинается с '[' и заканчивается ']'. Все что под этой строчкой и до начала следующей группы - хосты. У группы могут быть дети - другие группы, которые перечисляются после [название группы:children].

[WEB:children]
dbservers
dnsservers

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

  • файлы с переменными групп хранятся в директории group_vars/имя_группы;
  • файлы с переменными хостов в директории hosts_vars/имя_хоста;
  • файлы с переменными роли (о них речь пойдет ниже) в директории имя_роли/vars/имя_задачи.yml;

Переменные в inventory–файле

Иногда может потребоваться использование специфических переменных для конкретной группы хостов или конкретного хоста.

Установка переменных для конкретных хостов:

web001
db001 db_name=mysql
192.168.2.1 db_name=redis db_port=6380

Установка переменных для группы хостов (web):

[web]
web[001:010]
[db]
db[001:002]
[web:vars]
web_port=443

Переменные в отдельном файле для inventory

Можно создавать файлы переменных для хостов и для групп. Папки с этими файлами должны быть в одной директории с файлом inventory. Файлы переменных, относящихся к конкретным хостам, нужно сохранять в папку host_vars, относящиеся к конкретным группам - в папку group_vars.

Пример файла переменных для хоста web001 (~/ansible/host_vars/web001):

web_port_ssl=443
web_port=80

Пример файла переменных для группы db (~/ansible/group_vars/db):

db_port=6380
db_name=redis

Переменные inventory следуют иерархии: переменные в глобальном файле перегружают любые хост-переменные, групповые переменные и переменные в файле inventory. Хост-переменные перегружают групповые переменные, а в свою очередь групповые переменные перегружают переменные файла inventory.

Помимо пользовательских переменных можно (и даже нужно) использовать факты, собранные Ansible перед выполнением сценариев и отдельных задач.

Факты

Перед внесением изменений Ansible подключается к управляемым узлам и собирает информацию о них: о сетевых интерфейсах и их состоянии, об установленной операционной системе и т.п. Он может делать это как с помощью собственного модуля, так и с помощью инструментов ohai и facter, если они установлены (такая возможность специально предусмотрена для пользователей, уже имеющих опыт работы с системами удаленного управления конфигурациями: ohai и facter являются библиотеками фактов для Chef и Puppet). Все эти данные потом можно использовать в сценариях и шаблонах. Например, ip-адрес по-умолчанию можно получить, обратившись к переменной ansible_default_ipv4.

tasks:
    - debug: msg={{ansible_default_ipv4}}
$ ansible-playbook web.yml

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [111.111.111.111]

TASK: [debug msg="{{ansible_default_ipv4}}"] **********************************
ok: [111.111.111.111] => {
"msg": "{u'macaddress': u'06:a8:07:41:47:a5', u'network': u'172.31.0.0',
u'mtu': 9001, u'alias': u'eth0', u'netmask': u'255.255.240.0',
u'address': u'172.31.7.80', u'interface': u'eth0', u'type': u'ether',
u'gateway': u'172.31.0.1'}"
}

Примеры простых задач

Общая структура использования команд выглядит вот так:

ansible <pattern_goes_here> -m <module_name> -a <arguments>

С помощью Ansible можно одновременно выполнить одну задачу на целой группе серверов. Отправим запрос на ping на серверы выбранной группы:

$ ansible dnsservers -m ping

dns1.example.com | success >> {
"changed": false,
"ping": "pong"
}

dns2.example.com | success >> {
"changed": false,
"ping": "pong"
}

Если модуль (ключ -m) не задан, то используется модуль command. Фактически, ansible можно использовать не только как систему управления конфигурацией, но и как фреймворк для распределенного выполнения команд.

$ ansible -i hosts -a "ls -lah" all
localhost | success | rc=0 >>
total 12K
drwxr-xr-x  5 brun staff  170 Apr  1 11:50 .
drwxr-xr-x 91 brun staff 3.1K Apr  1 11:37 ..
-rw-r--r--  1 brun staff  230 Apr  1 12:07 export.sh
-rw-r--r--  1 brun staff   42 Apr  3 14:48 hosts
-rw-r--r--  1 brun staff  376 Apr  1 12:49 playbook.yml

Ansible позволяет не только выполнять единичные задачи, но и писать сценарии, которые необходимо выполнить на управляемых узлах. Рассмотрим структуру и правила написания таких сценариев более подробно.


Список источников

  • Официальная документация по Ansible
  • Система управления Ansible
  • Ansible - давайте попробуем
  • Администрирование Ansible
  • Автоматизируем и ускоряем процесс настройки облачных серверов с Ansible. Часть 1: Введение
  • Автоматизируем и ускоряем процесс настройки облачных серверов с Ansible. Часть 3: Переменные и файл inventory
  • « Alias
  • Ansible Introduction. Part 2 »
comments powered by Disqus

Published

Feb 10, 2017

Last Updated

Feb 21, 2017

Category

Administration

Tags

  • ansible 3
  • linux 7
  • python 7

Contact

Email Newsletter

  • Powered by Pelican. Theme: Elegant by Talha Mansoor