Быстрое развертывание среды разработки

в 11:18, , рубрики: chef, chef solo, vagrant, virtualbox, Веб-разработка, системное администрирование, метки: , , , , ,

Чтобы избежать больших затрат на развертывание сред разработки и тестирования, приближенных к среде эксплуатации (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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js