По моему мнению, большинству IT специалистов стоит использовать Vagrant. Кто не знает, что это такое – рекомендую начать с официального сайта. На Хабре так же было несколько обзоров вагранта, например Development Environment при помощи Vagrant и Chef и Создание новой виртуальной машины за одну минуту или «vagrant up!». В этой статье я более детально расскажу о «экосистеме» вагранта.
Если попробовать описать вагрант в несколько слов, то это инструмент для повторяемого создания окружения с помощью вашей любимой системы управления конфигурацией и вашей любимой системы виртуализации. И если систем виртаулизации и систем управления конфигурации существует достаточно много, то вагрант — один единственный продукт в своем роде, аналогов ему нет.
Но рассмотрим ситуацию более подробно. На данный момент вагрант поддерживает следующие системы виртуализации прямо из коробки:
- VirtualBox — именно с его поддержки начинался вагрант.
- VMware — для него нужен платный плагин.
- AWS — можно делать ваши виртуальные машины сразу в облаке Амазона.
Кроме того, сторонними разработчиками написаны следующие плагины (здесь, конечно, перечислены не все):
- Vagrant-lxc — плагин для системы контейнерной виртуализации. LXC, немного сыроват, но активно развивается.
- Vagrant-libvirt — обещает поддерживать все системы виртуализации, которые поддерживает libvirt, а их порядка десятка.
- Vagrant-kvm — плагин для системы виртуализации KVM.
- Vagrant-parallels — плагин для системы виртуализации Parallels. Оказывается, под Parallels можно запускать не только Windows на Mac, но и разрабатывать инфраструктуру, более того, сотрудники из нашей компании «Экспресс 42» успешно это делают. Плагин разрабатывает сама компания Parallels, и он активно развивается.
На всякий случай наш бокс для Parallels с Ubuntu 12.04 лежит здесь.
Используя различные системы виртуализации, вагрант может стать незаменимым инструментом, который проверяет разные аспекты вашей инфраструктуры с помощью тестов в CI окружении.
После того, как вы подключили вашу систему виртуализации, необходимо определиться с системой управления конфигурацией. На данный момент поддерживаются следующие системы настройки (provisioning):
- Shell — старые добрые shell-скрипты. В XXI веке уже не интересно.
- Ansible — молодая, набирающая обороты, система управления конфигурацией.
- Chef — про него, пожалуй, слышали все. Поддерживается standalone (Chef Solo) и серверная (Chef Client) версии.
- Docker — модная в последнее время система, поддерживающая концепцию Immutable Server (о ней мы рассказывали в крайнем выпуске подкаста Devops Deflope).
- Puppet — одна из наиболее распространенных систем управления конфигурацией. Поддерживается standalone и серверная версия.
- Salt — система управления конфигурацией Salt Stack.
Дальше все крайне просто — вам нужен «эталонный» образ операционной системы. Можно сделать самому, это не так сложно, а можно взять готовый, например, на сайте VagrantBox.es. Наш бокс для VirtualBox с Ubuntu 12.04 лежит здесь.
Если вы все же не любите готовых решений, то есть проекты, позволяющие автоматизировать создание базовых образов. Например, VeeWee (вводная статья о нем на Хабре) и Packer. Последний сделан Митчелом Хашимото, автором вагранта. К сожалению, русскоязычных обзоров его нету, но мы обязательно напишем о нем в одной из ближайших статей.
Важно отметить, что эталонный образ ОС имеет смысл использовать одинаковый для всех ваших окружений — от девелоперского до боевого.
После этого вы собираете все вместе с помощью Vagrantfile. Для примера я привожу файл конфигурации, который позволяет запускать сразу несколько машин, что очень полезно, если необходимо тестировать какое-то распределенное окружение.
Vagrant.configure("2") do |config|
config.vm.define :infra do |main|
main.vm.box = "ubuntu12.04-chef11"
main.vm.hostname = "infra"
config.vm.network :forwarde_port, guest: 80, host: 8002
config.vm.network :private_network, ip: "192.168.100.13"
main.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--memory", "2048"]
end
config.vm.provision :chef_solo do |chef|
chef.log_level = :info
chef.roles_path = "roles"
chef.data_bags_path = "data_bags"
chef.add_role "base"
chef.add_role "zabbix-db"
chef.add_role "zabbix-server"
chef.add_role "graylog2"
end
end
config.vm.define :vm1 do |main|
main.vm.box = "ubuntu12.04-chef11"
main.vm.hostname = "vm1"
config.vm.network :forwarded_port, guest: 80, host: 8001
config.vm.network :private_network, ip: "192.168.100.14"
main.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--memory", "2048"]
end
config.vm.provision :chef_solo do |chef|
chef.log_level = :info
chef.roles_path = "roles"
chef.data_bags_path = "data_bags"
chef.add_role "base"
chef.add_role "zabbix-client"
chef.add_role "projectname"
end
end
end
С подобным файлом конфигурации можно подымать виртуальный машины по отдельности, например, vagrant up infra
или vagrant up vm1
.
Здесь статью можно было бы закончить, но, помимо всего прочего, к вагранту существует множество плагинов, которые расширяют и дополняют его функциональность. Список наиболее известных плагинов есть в вики вагранта. Вот наиболее интересные из них, на мой взгляд.
- Vagrant-cachier — кэширует запросы к репозитариям различных менеджеров пакетов (deb, rpm), что позволяет поднимать машинки гораздо быстрее.
- Vagrant-librarian-chef — интеграция вагранта и librarian-chef. Более подробно прочитать о том, зачем нужен librarian-chef можно в нашей статье.
- Vagrant-berkshelf — интеграция вагранта и Berkshelf (аналог librarian-chef).
- Sahara — этот плагин позволяет делать «срезы» вашей виртуальной машины, чтобы можно было легко откатиться назад.
Вагрант помогает повторяемым образом подготавливать окружение ваших проектов. Вагрант позволяет начинать интеграцию с самой ранней стадии — со стадии разработки. Я глубоко убежден, что только так и можно «готовить» инфраструктуру. Но сейчас мало кто так готовит. А «Экспресс 42» готовит именно так.
Автор: evtuhovich