Антон Каляев — Быстрое развертывание среды с Vagrant

Preview:

Citation preview

БЫСТРОЕ РАЗВЕРТЫВАНИЕ СРЕДЫ РАЗРАБОТКИ САнтон Каляев

”Vagrant will change how you work”Vagrant изменит ваш подход к разработке

Как я раньше жил без него?

Идеальный мир

$ git clone git://github.com/project.git$ run

Мы счастливы

Реальный мир

$ git clone git://github.com/project.git$ читаем README$ wget -O SDL_image-1.2.11.tar.gz http://goo.gl/98zi6$ ./configure && make$ sudo make install$ пытаемся запустить хотя бы один тест$ ищем помощи у коллег$ MAGIC_CONST=23 prepare-run --fix-missing$ run

Мы в ****

Почему?

‣ создавать рабочие окружения тяжело ‣ распространять еще сложнее (README не установит требуемое ПО за нас) ‣ никакой изоляции (конфликтующие бинарники)‣ никаких гарантий (“Но это работает на моей машине”)

Решение

Идея

Виртуальная ОС Виртуальная ОС

ОС

Что такое Vagrant?

‣ инструмент для создания и распространения рабочих окружений на базе виртуальных машин (http://www.vagrantup.com/)

VagrantУправление VM из командной строки

остановка VM

старт VM

перезагрузка VM

vagrant up

vagrant reload

vagrant halt

доступ по sshvagrant ssh

1. Устанавливаем VirtualBox (https://www.virtualbox.org/wiki/Downloads)2. Устанавливаем Vagrant (http://downloads.vagrantup.com/)3. Загружаем Vagrant бокс

Устанавливаем Vagrant

Что такое Vagrant бокс?

‣ заранее упакованные образы виртуальных машин‣ список http://www.vagrantbox.es/‣ вы можете создать бокс сами :)

Как загрузить Vagrant бокс?

$ vagrant box add {title} {url}

Запускаем бокс

$ vagrant init {title}$ vagrant up

VagrantБазовый конфиг (Vagrantfile)

Vagrant.configure("2") do |config| config.vm.box = "ubuntu" config.vm.box_url = "https://github.com/downloads/roderik/VagrantQuantal64Box/quantal64.box"end

VagrantСинхронизация каталогов между гостевой и родной ОС

Vagrant.configure("2") do |config| ...

config.vm.synced_folder "~/projects", "/projects"end

VagrantНастройка сети

Vagrant.configure("2") do |config| ...

config.vm.network :private_network, ip: "10.11.12.13"

config.vm.network :forwarded_port, guest: 8080, host: 8080end

прокидываем портыстатический ip

Что получаем?

‣ легкость создания и настройки‣ изоляция (на каждый проект свой бокс)‣ отделение среды разработки от ОС

‣ система менеджмента конфигурации (SCM)‣ воплощение принципа “Инфраструктура как код”

или как управлять тысячей серверов

Chef cookbook

‣ набор действий по установке, настройке и запуску какого-то определенного программного пакета‣ обычно кроссплатформенные‣ состоит из одного или нескольких рецептов (recipes)‣ коллекция от Opscode https://github.com/opscode-cookbooks

Установка и настройка ПОНа примере Postgresql

Настраиваем provision

Vagrant.configure("2") do |config| ...

config.vm.provision :chef_solo do |chef| chef.cookbooks_path = ['cookbooks'] chef.add_recipe 'openssl' chef.add_recipe 'postgresql::server'

chef.json = { postgresql: { password: { postgres: 'mystrongpassword' } } } endend

Vagrantfile

Запускаем бокс

$ vagrant up

Что получаем?

‣ совпадает с продакшеном (можно и нужно использовать те же инструменты на продакшене)‣ переносимость

Переносимость

‣ вы можете скопировать файлы (или лучше разместить их в git репозитории)‣ вы можете упаковать существующий бокс

Способы распространения

$ vagrant package --output=/tmp/demo.box

Установка и настройка ПОПродвинутый уровень :)

Устанавливаем Berkshelf

$ gem install berkshelf$ vagrant plugin install berkshelf-vagrant$ berks init

перед этим нужно установить ruby (http://www.ruby-lang.org/en/downloads/)

Добавляем кукбук postgresqlBerksfile

site :opscode

cookbook 'postgresql'

Настраиваем provision

Vagrant.configure("2") do |config| ...

config.vm.provision :chef_solo do |chef| chef.cookbooks_path = ['cookbooks'] chef.add_recipe 'openssl' chef.add_recipe 'postgresql::server'

chef.json = { postgresql: { password: { postgres: 'mystrongpassword' } } } endend

Vagrantfile

не нужно указывать зависимости

кукбуки berkshelf автоматически подключаются в Vagrant’е

Запускаем бокс

$ berks install$ vagrant provision

Что получаем?

‣ никакого копирования‣ автоматическое подгрузка зависимостей‣ управление версиями

В итоге

+ единое окружение у всех разработчиков/тестировщиков и в продакшене

★ окружение легко создать и настроить ★ окружение изолировано★ окружение легко скопировать/перенести

+ меньше время входа нового человека в проект+ быстрая адаптация к новым требованиям

Vagrant providers

‣ VirtualBox‣ WMWare fusion‣ AWS (https://github.com/mitchellh/vagrant-aws)

Полезные плагины

‣ vagrant-vbguest (https://github.com/dotless-de/vagrant-vbguest) - следит за состоянием Guest Additions‣ veewee (https://github.com/jedi4ever/veewee) - автоматизация создания Vagrant боксов

Полезные настройкиИспользуем NFS для синхронизации каталогов

Vagrant.configure("2") do |config| ...

config.vm.synced_folder "~/projects", "/projects", :nfs => trueend

стандартный механизм медленный, так что используем NFS

Полезные настройки

Vagrant.configure("2") do |config| ...

config.ssh.forward_agent = trueend

Форвардинг SSH ключей

Vagrant.configure("2") do |config| ...

config.vm.provider :virtualbox do |vb| vb.customize ["modifyvm", :id, "--memory", 1024] endend

Полезные настройкиУвеличиваем объем оперативной памяти

Вопросы?

anton.kalyaev@gmail.comgithub.com/akalyaev

twitter.com/AntonKalyaev

Recommended