Итак, решил я по изучать системы оркестровки и управления конфигурацией и деплоем серверов. начинать надо с чего-то по проще, да по свежей. Поэтому я решил, что монстры типа Cheif и Puppet останутся на второе, а начну я с Ansible. Кому слово не знакомо прям совсем — вас ждет гостеприимный гугл, википедия и не менее гостепримный хабр.
А мы займемся сразу «мясом» — учить такие вещи надо на реальных юз-кейсах. Погнали — до этого мы осваивали Vagrant, его и задействуем в полную силу. Для начала- нам понадобится стенд из 3 виртуальных машин — Ansible server, с которого мы и будем дирижировать и пара подопытных — web сервер и сервер СУБД. Конфиг Vagranfile прост:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| config.vm.box = "ubuntu/xenial64" config.vm.define "ansible" do |ansible| ansible.vm.box = "ubuntu/xenial64" ansible.vm.hostname = "ansible-server" ansible.vm.network "private_network", ip: "192.168.100.9" config.vm.provider "virtualbox" do |ansible| ansible.name = "ansible-server" ansible.cpus = 1 ansible.memory = "1024" end ansible.vm.provision "shell", path: "ansible.sh" end config.vm.define "web" do |web| web.vm.box = "ubuntu/xenial64" web.vm.hostname = "web-server" #web.vm.network "private_network", type: "dhcp" web.vm.network "private_network", ip: "192.168.100.10" config.vm.provider "virtualbox" do |web| web.name = "web-server" web.cpus = 1 web.memory = "1024" end web.vm.provision "shell", path: "web.sh" end config.vm.define "db" do |db| db.vm.box = "ubuntu/xenial64" db.vm.hostname = "db" #db.vm.network "private_network", type: "dhcp" db.vm.network "private_network", ip: "192.168.100.11" config.vm.provider "virtualbox" do |db| db.name = "db" db.cpus = 1 db.memory = "1024" end db.vm.provision "shell", path: "db.sh" end end |
Скрипты провиженинга у всех имею одинаковое содержимое, т.к. далее эту задачу мы будем решать не Vagrant-ом. Вот пример:
1 2 3 4 |
#!/bin/bash apt-get update apt-get -y upgrade apt-get install -y mc htop tmux |
Даем команду 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.