По дирижируем оркестром. Ansible. Часть 1 — введение.

Итак, решил я по изучать системы оркестровки и управления конфигурацией и деплоем серверов. начинать надо с чего-то по проще, да по свежей. Поэтому я решил, что монстры типа Cheif и Puppet останутся на второе, а начну я с Ansible. Кому слово не знакомо прям совсем — вас ждет гостеприимный гугл, википедия и не менее гостепримный хабр.

А мы займемся сразу «мясом» — учить такие вещи надо на реальных юз-кейсах. Погнали — до этого мы осваивали Vagrant, его и задействуем в полную силу. Для начала- нам понадобится стенд из 3 виртуальных машин — Ansible server, с которого мы и будем дирижировать и пара подопытных — web сервер и сервер СУБД. Конфиг Vagranfile прост:

Скрипты провиженинга у всех имею одинаковое содержимое, т.к. далее эту задачу мы будем решать не Vagrant-ом. Вот пример:

Даем команду up, ждем пока взлетят все виртуалки, после чего заходим по ssh на ту, которая будет выполнять роль сервера ansible. Если поискать версию пакета ansible в репозитории (apt-cashe show ansble или aptitude show ansible) увидим, что там лежит версия 2.1.1, в то время как свежая-стабильная версия 2.3. Это не проблема — ставим ansible из их ppa репозитория:

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

Что у нас появилось новенького? Давайте заглянем в /etc… О, да ладно, каталог «ansible». Вот это поворот)) Наверное внутри мы найдем какие-то конфигурационные файлы. Действительно — внутри 2 файла и каталог (который пуст кстати) — cfg самого ansible и каталог с списком хостов. Хорошо, заберем его себе в домашнюю папку и поиграемся:

cp -r /etc/ansible/ ansible/

Итак, файл hosts довольно простой по структуре. Комментарии в нем подсказывают, что пустые строки игнорируются, строки начинающиеся с # это комментарии, строки в [скобках] воспринимаются как названия групп узлов а все прочее- как имена/адреса узлов. То есть либо имена, либо ip адреса. DNS сервер мы поднимать тут не будем, поэтому подопрем все костыльком-эмуляцией в виде записи в файле /etc/hosts — добавим записи  с именами и адресами хостов. Пусть они будут web-server и db-server.

Отлично! Теперь идем в файл hosts, который принадлежит ansible. Добавляем записи ( давайте сразу используем функционал групп)

Осталось только в cfg файле указать что мы используем файл из нашего домашнего каталога — меняем строку «#inventory = /etc/ansible/hosts» на «inventory = hosts» ( не забываем убрать комментарий). Ок, теперь подготовим наши машинки. Для доступа на другие хосты, Ansible использует ssh. Самый удобный вариант это ssh — ключи. Команда ssh-keygen поможет сгенерировать Вам простой ключ, а ssh-copy-id *имя сервера* — доставить его на нужный сервер ( под доставить я понимаю еще и настроить Ваш вход по нему).

Однако тут есть «мааааааленькая» загвоздка. Малюсенькая. Для первого входа с одной машины на другую, нам понадобится установить пользователю «ubuntu» пароль. Команда «passwd ubuntu», запущенная от рута поможет Вам ( почему от рута, ведь мы меняем свой пароль — попробуйте сами))) Должно же Вам быть немного интересно). После чего, копируем ключ на веб и дб сервер и проверяем вход на них по ssh — команда «ssh web-server» должна отработать без каких либо сообщений и пустить Вас на машину веб-сервера. Все, мы готовы продолжать!

И вот, казалось бы все готово к нашему триумфу как… что такое? Даем команду «ansible -m ping all » (для этого кстати надо зайти в наш каталог с конфигом ansible.cfg и исправленным файлом hosts, иначе утилита потянется к стандартному конфигу в /etc) и видим, что нам дают результат:

Не найден файл python по ожидаемому пути… Хм. В мою душу закрались смутные подозрения… Которые при проверке на наших целевых машинах полностью оправдались (если что, это сервер субд):

В ubuntu 16.04, в стандартной поставке идет только python3, а старого, доброго пайтона 2 версии нет( Ничего, apt-get install -y python-minimal спасет ситуацию. Кстати, стоит добавить эту команду в провижен скрипты Vagrant. Отлично, после этого у нас все идет как надо — проверка работоспособности Ansible пройдена

Но как-то скучно и пока не очень наглядно. Давайте сделаем более интересное телодвижение, показывающее, что Ansible работает и при этом это не тривиальный пинг.

Посмотрим — пусть он вернет нам локальный хостнейм всех узлов, время аптайма и некоторую информацию о системе.

Поиграйтесь сами- посмотрите, под кем Вы залогинены, попросив выполнить команду whoami, сколько осталось места на сервере, выполнив команду «df -h» и т.д. Это все хорошо, но может мы уже что-то по конфигурируем, спросите Вы? Скучно просто вытаскивать те данные, которые мы и так получим с помощью мониторинга. Ок, сказано- сделано. Давайте дадим простую команду — создадим пользователя. Только сделаем это изящно, средствами Ansible.

Создание пользователя потребует от нас повышения привелегий. Другими словами- запуск sudo и введение пароля. Все это делается очень легко:

Мы добавили пользователя на обе машины с помощью Ansible и с его же помощью убедились, что он появился в локальных списках пользователей. Теперь немного о тех мантрах, что я тут вбивал с клавиатуры (ansible -h нам в помощь):

  • -m MODULE_NAME, —module-name=MODULE_NAME  — имя модуля, который я собираюсь использовать. Как видно, мы попробовали два модуля — это shell ( отдавать команды) и user ( управлять пользователями)
  • -K, —ask-become-pass   — запросить пароль на случай, если потребуется эскалация привилегий.
  • -a MODULE_ARGS, —args=MODULE_ARGS — аргументы модуля. У каждого они свои.

Чтож, я думаю что на сегодня хватит. Для базового знакомства на «поиграться» хватит. В следующий раз сделаем так, чтобы у нас веб сервер и сбуд сервер действительно стали таковыми с помощью Ansible.