Чтобы избежать больших затрат на развертывание сред разработки и тестирования, приближенных к среде эксплуатации (development stage vs production stage parity), всё большую популярность приобретает виртуализация сред.
В этой статье я расскажу, как я создавал соответствующую репродуцируемую среду разработки для своего проекта runit-man с использованием Vagrant.
Для начала нам потребуется установить VirtualBox и сам Vagrant. Важно отметить, что VirtualBox крайне желательно устанавливать вместе с расширениями гостевой системы (Guest Extensions) той же версии, иначе развертывание будет нестабильным. Поскольку я веду разработку под MacOS X, то для меня важным оказался тот факт, что соответствующие гостевые расширения для последней версии VirtualBox отсутствуют. Поэтому я поставил VirtualBox 4.1.0 совместно с Vagrant 1.0.1.
Далее я использовал образ ОС Ubuntu (мне в принципе было безразлично, какой ОС пользоваться на этом этапе) под именем lucid32.
vagrant box add lucid32 http://files.vagrantup.com/lucid32.box
Далее я перешел в каталог проекта runit-man, и выполнил vagrant init
.
На целевой системе нам нужно будет развернуть runit, проект runit-man с ветки master исходного репозитория и запустить сервис runit-man на порту 14500, который нужно пробросить на порт 14500 основной операционной системы для удобства тестирования через браузер.
Любой образ системы, подготовленный для использования вместе с Vagrant, уже включает в себя ruby, и готов для развертывания посредством Chef, Puppet или с помощью иного инструментария.
Наиболее простым способом для меня было использование Chef в режиме Solo, который не требует инсталляции сервера Chef.
Соответственно, я создал папку cookbooks, где создал сборник рецептов provisioning.
Теперь Vagrantfile приобрел следующий вид:
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant::Config.run do |config|
# Every Vagrant virtual environment requires a box to build off of.
config.vm.box = "lucid32"
# Forward a port from the guest to the host, which allows for outside
# computers to access the VM, whereas host only networking does not.
config.vm.forward_port 14500, 14500
# Enable provisioning with chef solo, specifying a cookbooks path (relative
# to this Vagrantfile), and adding some recipes and/or roles.
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = "cookbooks"
chef.add_recipe "provisioning"
end
end
Для развертывания runit я положил в каталог cookbooks сборник рецептов runit (скачанный с GitHub).
Соответственно нам надо указать, что сборник provisioning зависит от сборника runit (cookbooks/provisioning/metadata.rb):
maintainer "Akzhan"
maintainer_email "akzhan.abdulin@gmail.com"
license "All rights reserved"
description "runit-man development VM"
version "0.1"
depends "runit"
Самое время развернуть пустую инсталляцию через vagrant up
и начать пошагово описывать рецепт provisioning::default, предварительно опробуя все в SSH (vagrant ssh
).
Для этого нам нужно будет доставить необходимые гемы через Bundler, установить Git и развернуть репозиторий и сервис runit-man (cookbooks/provisioning/recipes/default.rb):
package "git-core"
gem_package "bundler"
git "/home/runit-man" do
repository "git://github.com/Undev/runit-man.git"
end
bash "bundle" do
code "cd /home/runit-man && bundle install --without development"
end
runit_service "runit-man"
Определение runit_service автоматически поставит runit и создаст сервис runit-man, используя предоставленные нами шаблоны.
run-скрипт (cookbooks/provisioning/templates/default/sv-runit-man-run.erb):
#!/bin/bash
exec 2>&1
export PATH="$PATH:/opt/ruby/bin"
exec ruby /home/runit-man/local-run.rb --rackup 'bundle exec rainbows -c rainbows.conf -p 14500'
log-run-скрипт (cookbooks/provisioning/templates/default/sv-runit-man-log-run.erb).
#!/bin/bash
mkdir -p /var/log/runit-man
exec svlogd -tt /var/log/runit-man
На этом начальное развертывание среды закончено (в моем случае мне нужна была среда для проверки runit-man в различных граничных случаях, разработка в этой среде не ведется, поэтому пакеты для ведения разработки не ставились).
Теперь можно выполнить vagrant destroy; vagrant up
и проверить работу сервиса runit-man (http://localhost:14500/).
Ссылки:
Автор: akzhan