Знакомство с Ansible. Часть 1: Введение

Oct 19, 2015 17:32 · 812 words · 4 minute read ansible

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.

tweet Share