Vagrant — часть 1. Введение

Итак, есть такая штука- Vagrant, он же «бродяга».  Очень удобный инструмент, представляющий собою обертку над система виртуализации, реализующий как минимум две полезные функции:

  • Унификация управления виртуальными машинами — может надстраиваться над разными системами виртуализации, предоставляя единый синтаксис команд и конфигурационных файлов.
  • Создание воспроизводимого лабораторного стенда — один раз взяв шаблон ВМ и создав конфиг виртуального стенда, его можно воспроизводить одной командой снова и снова, тиражировать и переносить сколько угодно.

Кому будет удобен? — Разработчик, Админ, Тестер, DevOps и т.д. Представьте ситуацию — Вы хотите испытать новую технологию, софт, библиотеку и пр.

Что Вы делаете без Vagrant? — скачиваете установочный образ ОС, создаете виртуалку, настраиваете, инсталлируете ОС, инсталлируете все необходимое и только после этого начинаете пробовать, испытывать.  После чего останавливаете виртуалку, удаляете ее, следите, чтобы ничего не осталось.

Что Вы делаете с Vagrant? Открываете консоль, даете команду развернуть Вам стенд и ждете несколько минут. Конечно при условии, что Вы потрудились заранее заготовить себе шаблон-образ и конфигурационный файл стенда.

 

Что ж, давайте от слов к делу. Постараемся освоить Vagrant хотя бы базово, разобрав какую-нибудь базовую задачу.

Дано: предположим мне нужно создать тестовый стенд, состоящий из 2 виртуальных машин Linux (возьмем Ubuntu Server), на одной из которых будет развернут веб-сервер Apache + обвязка из необходимых библиотек PHP и самого PHP, на второй — СУБД Mysql/MariaDB.  На веб сервере должен быть установлен WordPress (под этим я понимаю  что должен быть скачан, распакован и помещен в нужный каталог архив со свежей версией, должны быть назначены права и должен быть создан соответствующий конфигурационный файл Apache), а на сервере СУБД должна быть создана под него БД, разрешена возможность подключаться к ней по сети с определенных хостов. Они должны находиться в одной виртуальной подсети, видеть друг друга. Так же, на обоих серверах нам нужно установить какой-нибудь набор прикладного ПО для администратора ( не важно какой, важен сам факт установки ПО на этапе подготовки стенда).

Да, кстати! Предполагаем, что у Вас уже установлена последняя версия VirtualBox и Extension Pack к нему!

Вариант 1 — ручной режим.

Для начала, проделаем все то же самое руками, чтобы понимать объем действий руками и объем затрачиваемого времени.

Не буду приводить тут процесс установки ubuntu сервер на VirtualBox ибо он тривиален. Скажу лишь что я поставлю одну машину, а вторую получу путем связного клонирования, чтобы упросить настройку и сэкономить время. Итак, засекаю…

Вот мой результат:

  • Скачать образ — 3 минуты
  • Создать VM (основную) — 1 минута
  • Установить ОС по методу «далее-далее-готово» — 7 минут
  • Обновить ОС — 8 минут
  • Клонировать Виртуалку — 30 секунд
  • Установить на 2 разные виртуалки Apache, Mysql, PHP с набором библиотек, а так же настроить Mysql чтобы он слушал не только localhost — 4 минуты.
  • Загрузить WordPress распаковать его в нужный каталог, поправить права, создать пользователя и базу в Mysql, создать конфиг Apache — еще 2,5 минуты

Итого 26 минут на две консоли, с непрерывным стуком по клавиатуре. То есть идеальная ситуация когда Вас никто и ничто не отвлекает.

Что мы получаем на выходе? — Окно приветствия WordPress в браузере, где нужно пройти мастер конфигурации ( вписать учетные данные субд, язык выбрать и пр)

Небольшой лог команд для установки. Они нам потом понадобятся при создании vagrant файлов

 

#Веб сервер

apt install -y apache2 php libapache2-mod-php php-mysql php-curl php-gd php-mbstring php-mcrypt php-xml php-xmlrpc zip

a2enmod rewrite

service apache2 restart

cd /tmp

wget http://wordpress.org/latest.zip

unzip latest.zip

mv wordrpess /var/www/

chown -R www-data:www-data /var/www/wordpress/

cd /etc/apache2/sites-available/

a2dissite 000-default.conf

cp 000-default.conf wordpress.conf

a2ensite wordpress.conf

vim wordpress.conf — поправить каталог, имя сайта

service apache2 restart

#Сервер СУБД

apt install -y mysql-server mysql-client

# vim /etc/mysql/mysql.conf.d/mysqld.cnf — поправить адрес на котором слушает сервер.

mysql -u root -p

CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

GRANT ALL ON wordpress.* TO ‘wordpress’@’*ip*’ IDENTIFIED BY ‘wordpress’;

 

Вариант 2 — применение Vagrant.

Ключевым источником информации для нас будет являться… естественно официальная документация!

Итак, установить Vagrant очень просто. Моей основной рабочей системой является дистрибутив на основе ubuntu Linux — для этого достаточно скачать пакет с офф сайта, установить его через dpkg. В других системах (в частности windows) установка может отличаться, но я не думаю что очень значительно.

Шаблоны систем в vagrant называются Boxes ( или коробочки). Можно как создавать свои, так и пользоваться уже готовыми, выложенными в офф. каталоге проекта. Там можно найти как «чистые» системы, так и с уже предустановленным и предконфигурированным ПО. Выбираем критерии поиска:

И получаем в поисковой выдаче регулярно обновляемый образ с «чистым» Ubuntu сервер.

Даем команду vagrant box add *имя бокса* и ждем пока он скачает шаблон.

Создаем папку под будущий проект и в ней выполняем команду vagrant init чтобы он создал шаблонный файл проекта. Теперь нам необходимо отредактировать этот файл (Vagrantfile) чтобы отразить в нем настройки нашего проекта. В нашем случае он получится вот такой:

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(«2») do |config|
config.vm.box = «ubuntu/xenial64»

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», inline: <<-SHELL
apt-get update
apt-get -y upgrade
apt-get install -y mc htop tmux mysql-client
apt-get install -y apache2 php libapache2-mod-php php-mysql php-curl php-gd php-mbstring php-mcrypt php-xml php-xmlrpc zip
a2enmod rewrite
service apache2 restart

cd /tmp
wget http://wordpress.org/latest.zip > /dev/null
unzip latest.zip
mv /tmp/wordpress/ /var/www/

cd /etc/apache2/sites-available/
a2dissite 000-default.conf
cp 000-default.conf wordpress.conf
a2ensite wordpress.conf

chown -R www-data:www-data /var/www/wordpress/

sed -i ‘s/html/wordpress/’ /etc/apache2/sites-available/wordpress.conf
sed -i ‘s/#ServerName www.example.com/ServerName worpdress.example.ru/’ /etc/apache2/sites-available/wordpress.conf
sed -i ‘s/ServerAdmin webmaster@localhost/ServerAdmin kirill@yandex.ru/’ /etc/apache2/sites-available/wordpress.conf

service apache2 restart
SHELL
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», inline: <<-SHELL
apt-get update
apt-get -y upgrade
apt-get install -y mc htop tmux

export DEBIAN_FRONTEND=noninteractive
debconf-set-selections <<< ‘mariadb-server-10.0 mysql-server/root_password password Qwerty.123’
debconf-set-selections <<< ‘mariadb-server-10.0 mysql-server/root_password_again password Qwerty.123’

apt-get install -y mariadb-server

sed -i ‘s/127.0.0.1/0.0.0.0/’ /etc/mysql/mariadb.conf.d/50-server.cnf

service mysql restart

mysql -u root -pQwerty.123 -e «CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;»
mysql -u root -pQwerty.123 -e «GRANT ALL ON wordpress.* TO ‘wordpress’@’192.168.100.10’ IDENTIFIED BY ‘wordpress’;»

SHELL
end
end

 

Да, на составление такого файла  Вы потратите какое-то время, но сделать это придется всего 1 раз! После чего Вы даете команду «vagrant up» (находясь в каталоге с этим файлом!) и ждете, пока не запустится Ваша лаборатория. Кстати, команда «vagrant up» запускает сразу весь файл — т.е. все указанные в нем машины. Если Вы хотите запустить только одну ( например для проверки настроек) — указывайте в конце команды имя создаваемой виртуальной машины. Например- у нас создаются 2 машины, это web и db. Соответственно, «vagrant up web» — создание и запуск машины с web сервером.

Итого, что у нас получилось:

  • Установить Vagrant — 1 минута
  • Скачать шаблон Ubuntu server box —  2 минуты
  • Создать папку и файл проекта — зависит от Вас, у меня заняло 3 минуты, т.к. я брал куски конфига из своих домашних заготовок+ знал что и где искать в документации.
  • Запуск проекта — примерно 11-12 минут

Итого 17-18 минут.

При этом стоить учитывать, что первые 3 пункта Вы выполняете 1 раз, а далее просто пользуетесь проектом, запуск которого выполняется 1 командой. И даже если Вас отвлекли — это не повлияет на время запуска. Если теперь просто запускать наш Vagrant  стенд одной командой, это займет (по моим измерениям) 4-5 минут, в зависимости от степени обновленности Вашего бокса-шаблона.

Возможные аргументы «против»

О, я уже слышу первый, и самый простой аргумент «против» — что мешает сделать «руками» такую же пару виртуалок, поставить их на паузу и включать когда нужно? Мы ведь сэкономим еще больше времени! А на тот случай, когда нам нужно соблюдать «чистоту установки» (чтобы стенд каждый раз был как новенький) — мы можем использовать клонирование, снепшоты!

Да, я согласен- это весомый аргумент. НО! Он имеет ощутимый вес до тех пор, пока Вам в работе нужен 1-2 стенда из 1-2 виртуалок. Дальше что?) Виртуальная машина, с установленным Ubuntu Server занимает порядка 1,5-2 гб места. Даже прибегая к технологии клонирования, когда у нас есть основная виртуалка- а прочие лишь дельты, хранящие отличия, для стенда из 2-х виртуальных машин, мы уже получаем 2 Гб занятого места Минимум! А если стендов больше? Например 3 стенда по 2 виртуалки (под WordPress, Joomla, Drupal)? уже 6 гб места съедается. А если больше? А если учесть объем места самих CMS? А дополнительное ПО? Я думаю до 10-ки Гб дорасти можно. Конечно, сейчас это не очень большая проблема но все же… Для сравнения, размер box-а, являющегося шаблоном, составляет 300 Мб. Т.е. для 3 стендов из 6 ВМ, вместо 10 Гб, Вам нужно хранить 300 мбайт и 3 текстовых файла, по паре Кб каждый. 10 Гб / 300 Мб = разница в 34 раза!!!!

Дополнительные аргументы ЗА

Как я уже говорил, помимо прямой экономии времени ( в данном случае она составляет разницу в 1,5 раза при первой установке и до 6 раз при повторном развертывании в нашем случае), есть еще косвенная — Вы начали готовить стенд, а тут Вас отвлекли. И ладно, когда Вы делаете его для себя, а вдруг Вас ждет разработчик, которому нужно срочно начать проект? В случае с Vagrant, вы просто набрали команду и все.

Более того, один раз составив конфигурационный файл, Вы можете отдать его разработчику, с указанием «создал папку, положил его туда, ввел команду» — вместо длинного мануала с кучей команд и указаний.

И наконец, при наличии таких простых, но очень полезных фич, как например быстрое и удобное подключение общих папок, автоматическую настройку доступа по ключу и пр (что мы разберем в дальнейшем) — жизнь и рабочий процесс становятся несколько легче. Мелочи, а приятно — ощутимо экономят время.

Заключение

Друзья, советую- попробуйте. Vagrant довольно дружелюбное и не сложное ПО, которое облегчает жизнь. Поверье — попробуете пару раз и будете восклицать — «как же я жил без этого раньше»?