Антон Каляев — Быстрое развертывание среды с vagrant
TRANSCRIPT
БЫСТРОЕ РАЗВЕРТЫВАНИЕ СРЕДЫ РАЗРАБОТКИ САнтон Каляев
”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
Скачиваем кукбуки
$ mkdir cookbooks$ git clone https://github.com/opscode-cookbooks/openssl.git cookbooks/openssl$ git clone https://github.com/opscode-cookbooks/postgresql.git 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
‣ менеджер кукбуков (как Bundler для Ruby gems) http://berkshelf.com/
Альтернатива - librarian-chef https://github.com/
applicationsonline/librarian-chef
Устанавливаем 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 provisioners
‣ Chef Solo‣ Chef Server‣ Puppet Standalone‣ Puppet Server‣ Shell
Полезные плагины
‣ vagrant-vbguest (https://github.com/dotless-de/vagrant-vbguest) - следит за состоянием Guest Additions‣ veewee (https://github.com/jedi4ever/veewee) - автоматизация создания Vagrant боксов
Примеры боксов для разработки
‣ Gitlab https://github.com/gitlabhq/gitlab-vagrant-vm‣ Rails https://github.com/rails/rails-dev-box‣ PHP https://github.com/dirkaholic/vagrant-php-dev-box
Полезные настройкиИспользуем 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
Полезные настройкиУвеличиваем объем оперативной памяти