Чтобы избежать больших затрат на развертывание сред разработки и тестирования, приближенных к среде эксплуатации (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.
Затем перешел в каталог проекта runit-man, и выполнил
На целевой системе нам нужно будет развернуть runit, проект runit-man с ветки master исходного репозитория и запустить сервис runit-man на порту 14500, который нужно пробросить на порт 14500 основной операционной системы для удобства тестирования через браузер.
Любой образ системы, подготовленный для использования вместе с Vagrant, уже включает в себя ruby, и готов для развертывания посредством Chef, Puppet или с помощью иного инструментария.
Наиболее простым способом для меня было использование Chef в режиме Solo, который не требует инсталляции сервера Chef.
Соответственно, создал папку cookbooks, где создал сборник рецептов provisioning.
Теперь Vagrantfile приобрел следующий вид:
Для развертывания runit я положил в каталог cookbooks сборник рецептов runit (скачанный с GitHub).
Соответственно нам надо указать, что сборник provisioning зависит от сборника runit (cookbooks/provisioning/metadata.rb):
Самое время развернуть пустую инсталляцию через
Для этого нам нужно будет доставить необходимые гемы через Bundler, установить Git и развернуть репозиторий и сервис runit-man (cookbooks/provisioning/recipes/default.rb):
Определение runit_service автоматически поставит runit и создаст сервис runit-man, используя предоставленные нами шаблоны.
run-скрипт (cookbooks/provisioning/templates/default/sv-runit-man-run.erb):
log-run-скрипт (cookbooks/provisioning/templates/default/sv-runit-man-log-run.erb).
На этом начальное развертывание среды закончено (в моем случае мне нужна была среда для проверки runit-man в различных граничных случаях, разработка в этой среде не ведется, поэтому пакеты для ведения разработки не ставились).
Теперь можно выполнить
Дополнительный бонус: этим же набором сборников рецептов можно пользоваться и для развёртывания сред эксплуатации.
Ссылки:
В этой статье я расскажу, как создавал соответствующую репродуцируемую среду разработки на примере своего проекта 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 Abdulin" maintainer_email "akzhan.abdulin@gmail.com" license "MIT License" 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 -f; vagrant up и проверить работу сервиса runit-man (http://localhost:14500/).Дополнительный бонус: этим же набором сборников рецептов можно пользоваться и для развёртывания сред эксплуатации.
Ссылки:
