Привет, читатели! Сегодня я хотел бы рассказать о инструментах, которые облегчают тестирование кукбуков. В чем собственно проблема? С ростом масштаба инфраструктуры становится сложнее следить за зависимостями и последствиями внесения изменений в кукбуки и на повестке дня становится вопрос о их тестировании. Решить данные проблемы помогают такие инструменты, как foodcritics, chefspec, minitest, test kitchen…
В данном посте я хотел бы поделиться своим опытом по освоению test kitchen в «преславутый 21 день». Я старался чтобы данный пост был максимально прост и удобен для начального ознакомления с test kitchen.
Для начала работы Вам понадобится следующий софт: vagrant, virualbox и собственно сам test kitchen.
В качестве рабочей ОС я использвал windows 7 x64. Почему windows? Скажем так, такова была постановка задачи.
У меня это заняло 3 часа времени. Поэтому если Вы хотите пройти все шаги самостоятельно имеет смысл зарезервировать на это пол дня.
Итак, поехали:
ШАГ 1. Подготовка окружения
VirtualBox & Vagrant
Для начала нам понадобится установленные VirtualBox и vagrant
После установки vagrant'a необходимо выполнить перезагрузку.
После перезагрузки проверяем работоспособность vagrant:
mkdir C:vagrant && cd C:vagrant
C:vagrant>vagrant box add precise32 http://files.vagrantup.com/precise32.box
Downloading box from URL: http://files.vagrantup.com/precise32.box
Extracting box...ate: 3089k/s, Estimated time remaining: --:--:--)
Successfully added box 'precise32' with provider 'virtualbox'!
C:vagrant>vagrant init
-- config.vm.box = "base"
++ config.vm.box = "precise32"
C:vagrant>vagrant up
login as: vagrant
vagrant@localhost's password: vagrant
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic-pae i686)
* Documentation: https://help.ubuntu.com/
Welcome to your Vagrant-built virtual machine.
Если удалось подключится — значит все сделали правильно.
Ruby & Ruby DevKit
Теперь нужно установить ruby.
Если у Вас установлен chef-client его необходимо удалить, т.к. мы будем использовать установленный через gem.
Во время установки нужно отметить пункт «Add Ruby executables to your PATH» чтобы можно было свободно запускать ruby из командной строки.
Далее нужно установить DevKit, т.к. он содержит необходимый набор ПО(компилятор, библиотеки — одним словом Devkit). Хочу обратить Ваше внимание на то, что установку желательно производить в каталог по умолчанию(как ruby так и DevKit) иначе могут возникнуть проблемы.
Для установки проделываем следующие шаги:
mkdir C:devkit && cd C:devkit
C:devkit>ruby dk.rb init
[INFO] found RubyInstaller v1.9.3 at C:/Ruby193
Initialization complete! Please review and modify the auto-generated
'config.yml' file to ensure it contains the root directories to all
of the installed Rubies you want enhanced by the DevKit.
Видим что определились путь и версия установленного ruby
C:DevKit>ruby dk.rb install
[INFO] Updating convenience notice gem override for 'C:/Ruby193'
[INFO] Installing 'C:/Ruby193/lib/ruby/site_ruby/devkit.rb'
После выполненя ruby dk.rb install в PATH должны добавиться пути к DevKit,
но, к сожалению, этого не произошло:
C:DevKit>echo %PATH%
C:Windowssystem32;C:Windows;C:WindowsSystem32Wbem;C:WindowsSystem32WindowsPowerShellv1.0;C:Ruby193bin
Значит нужно вручную добавить в PATH путь к DevKit директории.
Есть несколько вариантов как это сделать:
1. В командной строке выполнить команду
setx PATH "C:DevKitmingwbin;C:DevKitbin"
в данном случае создастся переменная PATH в пользовательских переменных;
2. Открвыаем cmd от имени Администратора и выполняем:
setx PATH "%PATH%;C:DevKitmingwbin;C:DevKitbin" /M
в данном случае пути к Devkit добавятся в конец системной переменной PATH
3. Данный способ рекомендуется если Вы не уверенны в первых двух:
Мой компьютер > Свойства > Дополнительные параметры системы > Переменные среды.
Редактируем PATH и добавляем C:DevKitbin и C:DevKitmingwbin
Открываем новый терминал(cmd) и проверяем:
C:Userscc>echo %PATH%
C:Windowssystem32;C:Windows;C:WindowsSystem32Wbem;C:WindowsSystem32WindowsPowerShellv1.0;C:Ruby193bin;C:DevKitmingwbin;C:DevKitbin
ШАГ 2. Установка Test Kitchen
И, наконец, можем приступить к уставновке test kitchen:
C:>mkdir C:kitchen && cd C:kitchen
C:DevKit>gem install bundler
Fetching: bundler-1.5.2.gem (100%)
Successfully installed bundler-1.5.2
1 gem installed
Installing ri documentation for bundler-1.5.2...
Installing RDoc documentation for bundler-1.5.2...
source 'https://rubygems.org'
gem 'berkshelf', '~> 2.0.0' # use for manage cookbook dependencies
gem 'chef', '~> 11.6.0'
gem 'chef-zero'
gem 'json', '1.7.7' # needed for conflict resolution
gem 'kitchen-vagrant'
gem 'test-kitchen'
C:kitchen>bundle install
Fetching gem metadata from https://rubygems.org/.......
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Installing i18n (0.6.9)
Installing multi_json (1.8.4)
Installing activesupport (3.2.16)
…
Installing test-kitchen (1.0.0)
Installing kitchen-vagrant (0.11.3)
Using bundler (1.5.2)
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
mkdir C:kitchencookbooks && cd C:kitchencookbooks && knife cookbook site download sendmail
C:kitchen>kitchen init
create .kitchen.yml
create test/integration/default
create .gitignore
append .gitignore
append .gitignore
---
driver_plugin: vagrant
driver_config:
require_chef_omnibus: true
platforms:
- name: ubuntu-12.04
driver_config:
box: opscode-ubuntu-12.04
box_url: https://opscode-vm-bento.s3.amazonaws.com/vagrant/opscode_ubuntu-12.04_provisionerless.box
suites:
- name: default
run_list: ["recipe[sendmail]"]
attributes: {}
C:kitchen>kitchen test
.....................
←[0m[2014-01-11T10:17:15+00:00] INFO: *** Chef 11.8.2 ***←[36m
←[0m[2014-01-11T10:17:15+00:00] INFO: Chef-client pid: 1169←[36m
←[0m[2014-01-11T10:17:16+00:00] INFO: Setting the run_list to ["recipe[sendmail]"] from JSON←[36m
←[0m[2014-01-11T10:17:16+00:00] INFO: Run List is [recipe[sendmail]]←[36m
←[0m[2014-01-11T10:17:16+00:00] INFO: Run List expands to [sendmail]←[36m
←[0m[2014-01-11T10:17:16+00:00] INFO: Starting Chef Run for default-ubuntu-1204←[36m
←[0m[2014-01-11T10:17:16+00:00] INFO: Running start handlers←[36m
←[0m[2014-01-11T10:17:16+00:00] INFO: Start handlers complete.←[36m
←[0mCompiling Cookbooks...←[0m←[36m
←[0mConverging 2 resources←[0m←[36m
←[0mRecipe: sendmail::default←[0m←[36m
←[0m * package[sendmail] action install←[0m[2014-01-11T10:17:16+00:00] INFO: Processing package[sendmail] action install(sendmail::default line 1)←[36m
←[0m←[32m←[36m
←[0m - install version 8.14.4-2ubuntu2 of package sendmail←[0m←[36m
←[0m←[0m←[36m
←[0m * service[sendmail] action enable←[0m[2014-01-11T10:17:27+00:00] INFO: Processing service[sendmail] action enable (sendmail::default line 6)←[36m
←[0m[2014-01-11T10:17:27+00:00] INFO: service[sendmail] enabled←[36m
←[0m←[32m←[36m
←[0m - enable service service[sendmail]←[0m←[36m
←[0m←[0m←[36m
←[0m * service[sendmail] action start←[0m[2014-01-11T10:17:27+00:00] INFO: Processing service[sendmail] action start (sendmail::default line 6)←[36m
←[0m (up to date)←[0m←[36m
←[0m[2014-01-11T10:17:27+00:00] INFO: Chef Run complete in 11.695990777 seconds←[36m
←[0m[2014-01-11T10:17:27+00:00] INFO: Running report handlers←[36m
←[0m[2014-01-11T10:17:27+00:00] INFO: Report handlers complete←[36m
←[0mChef Client finished, 2 resources updated←[0m←[36m
←[0m←[36m Finished converging <default-ubuntu-1204> (0m29.54s).
←[0m←[36m-----> Setting up <default-ubuntu-1204>
←[0m←[36m Finished setting up <default-ubuntu-1204> (0m0.00s).
←[0m←[36m-----> Verifying <default-ubuntu-1204>
←[0m←[36m Finished verifying <default-ubuntu-1204> (0m0.00s).
←[0m←[36m-----> Destroying <default-ubuntu-1204>
←[0m←[36m [kitchen::driver::vagrant command] BEGIN (vagrant destroy -f)
←[0m←[36m [default] Forcing shutdown of VM...
←[0m←[36m [default] Destroying VM and associated drives...
←[0m←[36m [kitchen::driver::vagrant command] END (0m0.00s)
←[0m←[36m Vagrant instance <default-ubuntu-1204> destroyed.
←[0m←[36m Finished destroying <default-ubuntu-1204> (0m4.85s).
←[0m←[36m Finished testing <default-ubuntu-1204> (1m16.33s).
←[0m-----> Kitchen is finished. (1m16.69s)
Видим что chef-client отработал без ошибок и пакет sendmail был успешно установлен.
После успешного выполнения инстанс удаляется.
В случае же ошибки, инстанс отстается запущеным.
Это сделано для того чтобы можно было проанализировать проблему внутри инстанса.
ШАГ 3. Berkshelf
Berkshelf нам нужен для разрешения проблем с зависимостями кукбуков.
Т.к. мы его установили на прошлом этапе — приступаем к настройке:
C:kitchen>vagrant plugin install vagrant-berkshelf
Installing the 'vagrant-berkshelf' plugin. This can take a few minutes...
Installed the plugin 'vagrant-berkshelf (1.3.7)'!
C:kitchen>berks init chef-cook
create chef-cook/Berksfile
create chef-cook/Thorfile
create chef-cook/.gitignore
run git init from "./chef-cook"
C:/Ruby193/bin/berks: No such file or directory - git init
create chef-cook/Gemfile
create .kitchen.yml
append Thorfile
create test/integration/default
append Gemfile
append Gemfile
You must run `bundle install' to fetch any new gems.
create chef-cook/Vagrantfile
Successfully initialized
cd C:kitchenchef-cook && bundle install
mkdir C:kitchenchef-cookcookbooks && cd C:kitchenchef-cookcookbooks && berks cookbook mytest
C:kitchenchef-cook.kitchen.yml
---
suites:
- name: default
run_list: ["recipe[mytest]"]
attributes: {}
C:kitchenchef-cook>kitchen test
и получаем ошибку:
ERROR: Cookbook mytest not found. If you're loading mytest from another cookbook, make sure you configure the dependency in your metadata
для того чтобы её исправить нужно добавить в Berksfile следующую строку:
cookbook 'mytest', :path => 'cookbooks/mytest'
данная запись говорит где Berkshelf может найти данный кукбук.
Далее немного усложним задачу, добавив зависимость от кукбука, которого у нас локально нет, например sendmail.
include_recipe 'sendmail'
depends 'sendmail'
site :opscode
cookbook 'sendmail'
cookbook 'mytest', :path => 'cookbooks/mytest'
Т.е. мы добавили «cookbook 'sendmail'», данная запись говорит о том что в случае необходимости Berkshelf может скачать кукбук sendmail с комьюнити репозитория.
C:kitchenchef-cook>kitchen conerge
....
←[0m←[36m Resolving cookbook dependencies with Berkshelf...
←[0mInstalling sendmail (0.1.0) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
Using mytest (0.1.0) at './cookbooks/mytest'
....
←[0m * package[sendmail] action install←[0m[2014-01-15T08:00:44+00:00] INFO: Processing package[sendmail] action install (sendmail::default line 1)←[
....
←[0mChef Client finished, 2 resources updated←[0m←[36m
←[0m←[36m Finished converging <default-ubuntu-1204> (0m18.25s).
←[0m-----> Kitchen is finished. (0m18.68s)
Из данного лога видно что кукбук sendmail успешно скачался и пакет sendmail был установлен.
Повторюсь, данный пост ориентирован на новичков в данном направлении, чтобы показать самые азы данных инструментов. Но, тем не менее, используя их можно управлять большим количеством кукбуков. Возможно, в дальнейшем напишу более детально об использовании Berkshelf
Полезные ссылки
Chef HomePage
Test Kitchen HomePage
Berkshelf HomePage
Opscode community cookbooks
Более детально о самом chef'е пишет MistiC тут
Автор: Siah