Знакомство с Ansible. Часть 1: Введение
Oct 19, 2015 17:32 · 812 words · 4 minute read
Ansible
– одна из систем управления конфигурациями (автоматизации настройки и развертывания серверов).
Особенность Ansible
– наличие управляющего сервера, с которого отправляются команды или наборы инструкций (playbooks) на удаленные хосты посредством протокола SSH.
Ansible
успешно решает следующие задачи:
- правильная и быстрая настройка серверов до нужной конфигурации;
- управление развертыванием облачных серверов (через API, с помощью Docker);
- установка и обновление приложений;
- координация звеньев инфраструктуры для выполнения развертываний;
- централизованный сбор логов.
Ansible
не требует установки на удаленные хосты клиентских приложений, так как подключается к ним по протоколу SSH — это и есть главное отличие от других инструментов управления конфигурациями.
Чтобы «пощупать» Ansible
потребуется один управляющий сервер и несколько хостов для настройки. На управляющем сервере у нас установлена операционная система Debian Wheezy, на удаленных хостах — Ubuntu 14.04.
Установка Ansible
не должна вызывать трудностей:
- перед установкой обновим имеющиеся в системе пакеты:
apt-get update && apt-get upgrade
- непосредственно установка Ansible:
echo 'deb http://http.debian.net/debian wheezy-backports main' > /etc/apt/sources.list.d/backports.list
apt-get update
apt-get -t wheezy-backports install "ansible"
Для настройки Ansible
используется файл конфигурации ansible.cfg
, который может находиться в таких местах:
./ansible.cfg
– в текущем каталоге;~/.ansible.cfg
— в домашнем каталоге;/etc/ansible/ansible.cfg
— в каталоге, созданном при установке через менеджер пакетов (наш случай).
Примечание. Некоторые параметры или даже всю конфигурацию также можно переопределить в playbook или переменных окружения.
Параметров настройки Ansible
довольно много, вот некоторые из наиболее часто используемых:
hostfile:
— путь кinventory file
, содержит список ip-адресов (или имен) хостов для подключения;library:
— путь к модулямAnsible
;forks:
— кол-во потоков, которые может создатьAnsible
;sudo_user:
— пользователь, от которого запускаются команды/инструкции на удаленных хостах;remote_port:
— порт для подключения по протоколу SSH;host_key_checking:
— включить/отключить проверку SSH–ключа на удаленном хосте;timeout:
— таймаут подключения по SSH;log_path:
— путь к файлу логов.
Перечислим имена удаленных хостов, с которыми будем проводить эксперименты в файле /etc/ansible/hosts
. Для этого:
- переходим в каталог
/etc/ansible
:
cd /etc/ansible
- переименуем существующий файл
hosts
:
mv hosts hosts.orig
- и создадим новый файл
hosts
:
touch hosts
Содержимое файла будет следующим:
[test]
test-1
test-2
Также нужно сгенерировать на управляющем сервере ключ для доступа к удаленным хостам по SSH, для этого используем утилиту ssh-keygen
. Копируем публичный ключ на удаленные хосты утилитой ssh-copy-id
.
Для проверки правильности настройки Ansible
делаем следующее:
- пингуем удаленные хосты:
ansible test -m ping
test-1 | success >> {
"changed": false,
"ping": "pong"
}
test-2 | success >> {
"changed": false,
"ping": "pong"
}
- просмотрим информацию об использовании оперативной памяти на удаленных хостах:
ansible test -a "free -h"
test-1 | success | rc=0 >>
total used free shared buffers cached
Mem: 7.6G 6.4G 1.2G 471M 64M 1.2G
-/+ buffers/cache: 5.2G 2.4G
Swap: 4.0G 616M 3.4G
test-2 | success | rc=0 >>
total used free shared buffers cached
Mem: 3.9G 3.3G 573M 333M 4.8M 442M
-/+ buffers/cache: 2.9G 1.0G
Swap: 4.0G 1.7G 2.3G
Работа с наборами инструкций (playbooks) — главная задача Ansible
. Наборы инструкций содержат задачи и должны быть описаны в формате YAML. Задача использует часть кода-модуля, который может быть написан на любом языке программирования (но есть одно важное требование — сообщения от модулей должны быть в формате JSON).
Несколько слов о правилах написания YAML-файлов:
- все YAML-файлы должны начинаться с
---
. Эта часть формата YAML означает начало документа; - члены списка должны начинаться с пробела или
-
и иметь одинаковые отступы от начала строки; - комментарии начинаются с символа
#
; - словарь описывается в виде
ключ: значение
и может быть представлен в сокращенной форме.
В playbook может находиться список удаленных хостов, переменных пользователя, задач, обработчиков (как уже упоминалось ранее, здесь можно переопределять параметры конфигурации). Каждый набор инструкций (за исключением ролей) обязательно должен иметь поле hosts:
. Кроме этого, набор инструкций содержит задачи — список действий, которые нужно выполнить на удаленных хостах.
Давайте разберемся с синтаксисом конкретного набора инструкций на примере установки web-сервера nginx
:
- создаем каталог, для хранения наших playbooks:
mkdir /etc/ansible/playbooks
- в каталоге
/etc/ansible/playbooks
создаем файлinstall_nginx.yml
:
touch /etc/ansible/playbooks/install_nginx.yml
Содержимое файла следующее:
---
- hosts: test
tasks:
- name: Install package nginx
apt: name=nginx update_cache=yes
sudo: yes
- name: Starting service nginx
service: name=nginx state=started
sudo: yes
В данном примере поле hosts:
содержит группу, на которой будет запущена задача (test).
Узнать, на каких хостах будет происходить работа, можно командой:
ansible-playbook <имя_набора_инструкций> --list-host
Поле tasks:
содержит имена задач (Install package nginx и Starting service nginx), имена модулей, которые должны выполняться (apt
и service
) и аргументы, необходимые для выполнения модуля (для первого это name=nginx
update_cache=yes
, для второго — name=nginx
state=started
).
Дополнительно указано, что для выполнения задач необходимы права суперпользователя (sudo: yes
).
Запустить только что созданный набор инструкций можно следующей командой:
ansible-playbook install_nginx.yml
PLAY [test] ******************************************************************
GATHERING FACTS ***************************************************************
ok: [test-1]
ok: [test-2]
TASK: [Install package nginx] *************************************************
changed: [test-1]
changed: [test-2]
TASK: [Starting service nginx] ************************************************
ok: [test-1]
ok: [test-2]
PLAY RECAP ********************************************************************
test-1 : ok=3 changed=1 unreachable=0 failed=0
test-2 : ok=3 changed=1 unreachable=0 failed=0
После выполнения набора инструкций убедимся что nginx
корректно установлен перейдя в браузере на ip-адрес удаленных хостов.
На этом все, в следующей статье разберем вывод данного playbook и продолжим разбираться с Ansible
.