Привет, Хабраюзеры! Сегодня я хотел бы рассказать о инструментах, которые облегчают тестирование кукбуков. В чем собственно проблема? С ростом масштаба инфраструктуры становится сложнее следить за зависимостями и последствиями внесения изменений в кукбуки и на повестке дня становится вопрос о их тестировании. Решить данные проблемы помогают такие инструменты, как foodcritics, chefspec, minitest, test kitchen…
В данном посте я хотел бы поделиться своим опытом по освоению test kitchen в «преславутый 21 день». Я старался чтобы данный пост был максимально прост и удобен для начального ознакомления с test kitchen.
Для начала работы Вам понадобится следующий софт: vagrant, virualbox и собственно сам test kitchen.
В качестве рабочей ОС я использвал windows 7 x64. Почему windows? Скажем так, такова была постановка задачи.
У меня это заняло 3 часа времени. Поэтому если Вы хотите пройти все шаги самостоятельно имеет смысл зарезервировать на это пол дня.
Итак, поехали:
Для начала нам понадобится установленные VirtualBox и vagrant
После установки vagrant'a необходимо выполнить перезагрузку.
После перезагрузки проверяем работоспособность vagrant:
Теперь нужно установить ruby.
Если у Вас установлен chef-client его необходимо удалить, т.к. мы будем использовать установленный через gem.
Во время установки нужно отметить пункт «Add Ruby executables to your PATH» чтобы можно было свободно запускать ruby из командной строки.
Далее нужно установить DevKit, т.к. он содержит необходимый набор ПО(компилятор, библиотеки — одним словом Devkit). Хочу обратить Ваше внимание на то, что установку желательно производить в каталог по умолчанию(как ruby так и DevKit) иначе могут возникнуть проблемы.
Для установки проделываем следующие шаги:
И, наконец, можем приступить к уставновке test kitchen:
Berkshelf нам нужен для разрешения проблем с зависимостями кукбуков.
Т.к. мы его установили на прошлом этапе — приступаем к настройке:
Далее немного усложним задачу, добавив зависимость от кукбука, которого у нас локально нет, например sendmail.
Повторюсь, данный пост ориентирован на новичков в данном направлении, чтобы показать самые азы данных инструментов. Но, тем не менее, используя их можно управлять большим количеством кукбуков. Возможно, в дальнейшем напишу более детально об использовании Berkshelf
Chef HomePage
Test Kitchen HomePage
Berkshelf HomePage
Opscode community cookbooks
Более детально о самом chef'е пишет MistiC тут
В данном посте я хотел бы поделиться своим опытом по освоению test kitchen в «преславутый 21 день». Я старался чтобы данный пост был максимально прост и удобен для начального ознакомления с test kitchen.
Для начала работы Вам понадобится следующий софт: vagrant, virualbox и собственно сам test kitchen.
В качестве рабочей ОС я использвал windows 7 x64. Почему windows? Скажем так, такова была постановка задачи.
У меня это заняло 3 часа времени. Поэтому если Вы хотите пройти все шаги самостоятельно имеет смысл зарезервировать на это пол дня.
Итак, поехали:
ШАГ 1. Подготовка окружения
VirtualBox & Vagrant
Для начала нам понадобится установленные VirtualBox и vagrant
После установки vagrant'a необходимо выполнить перезагрузку.
После перезагрузки проверяем работоспособность vagrant:
1. Создаем папку для нашего тестового инстанса:
mkdir C:\vagrant && cd C:\vagrant
2. Добавляем precise32 box:
3. Инициализируем конфигурацию. Данная команда создаст конфигурационный файл Vagrantfile:
C:\vagrant>vagrant init
4. Редактируем файл Vagrantfile :
-- config.vm.box = "base"
++ config.vm.box = "precise32"
5. Теперь мы готовы запустить наш инстанс:
C:\vagrant>vagrant up
6. После того как команда отработает подключаемся по ssh к localhost:2222 :
Ruby & Ruby DevKit
Теперь нужно установить ruby.
Если у Вас установлен chef-client его необходимо удалить, т.к. мы будем использовать установленный через gem.
Во время установки нужно отметить пункт «Add Ruby executables to your PATH» чтобы можно было свободно запускать ruby из командной строки.
Далее нужно установить DevKit, т.к. он содержит необходимый набор ПО(компилятор, библиотеки — одним словом Devkit). Хочу обратить Ваше внимание на то, что установку желательно производить в каталог по умолчанию(как ruby так и DevKit) иначе могут возникнуть проблемы.
Для установки проделываем следующие шаги:
1. Создаем папку:
mkdir C:\devkit && cd C:\devkit
2. Скачиваем в нее архив и распаковываем его в текущую директорию:
3. Инициализируем установку:
Видим что определились путь и версия установленного ruby
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
4. Устанавливаем:
После выполненя ruby dk.rb install в PATH должны добавиться пути к DevKit,
но, к сожалению, этого не произошло:
Значит нужно вручную добавить в PATH путь к DevKit директории.
Есть несколько вариантов как это сделать:
1. В командной строке выполнить команду
в данном случае создастся переменная PATH в пользовательских переменных;
2. Открвыаем cmd от имени Администратора и выполняем:
в данном случае пути к Devkit добавятся в конец системной переменной PATH
3. Данный способ рекомендуется если Вы не уверенны в первых двух:
Редактируем PATH и добавляем C:\DevKit\bin\ и C:\DevKit\mingw\bin\
Открываем новый терминал(cmd) и проверяем:
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:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Ruby193\bin
Значит нужно вручную добавить в PATH путь к DevKit директории.
Есть несколько вариантов как это сделать:
1. В командной строке выполнить команду
setx PATH "C:\DevKit\mingw\bin\;C:\DevKit\bin\"
в данном случае создастся переменная PATH в пользовательских переменных;
2. Открвыаем cmd от имени Администратора и выполняем:
setx PATH "%PATH%;C:\DevKit\mingw\bin\;C:\DevKit\bin\" /M
в данном случае пути к Devkit добавятся в конец системной переменной PATH
3. Данный способ рекомендуется если Вы не уверенны в первых двух:
Мой компьютер > Свойства > Дополнительные параметры системы > Переменные среды.
Редактируем PATH и добавляем C:\DevKit\bin\ и C:\DevKit\mingw\bin\
Открываем новый терминал(cmd) и проверяем:
C:\Users\cc>echo %PATH%
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Ruby193\bin;C:\DevKit\mingw\bin\;C:\DevKit\bin\
ШАГ 2. Установка Test Kitchen
И, наконец, можем приступить к уставновке test kitchen:
1. Создаем папку для работы с test kitchen:
C:\>mkdir C:\kitchen && cd C:\kitchen
2. Устанавливаем bundler
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...
3. В текстовом редакторе создаем файл Gemfile с содержанием:
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'
4. Запускаем установку:
…
C:\kitchen>bundle install
Fetching gem metadata from rubygems.org.......
Fetching additional metadata from 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.
5. скачиваем и распакаовываем в текущую директорию. cookbook для теста(я для примера взял sendmail):
mkdir C:\kitchen\cookbooks && cd C:\kitchen\cookbooks && knife cookbook site download sendmail
7. Инициализируем настройки test kitchen:
C:\kitchen>kitchen init
create .kitchen.yml
create test/integration/default
create .gitignore
append .gitignore
append .gitignore
8. Для запуска одного инстанса приводим .kitchen.yml к виду:
---
driver_plugin: vagrant
driver_config:
require_chef_omnibus: true
platforms:
- name: ubuntu-12.04
driver_config:
box: opscode-ubuntu-12.04
box_url: opscode-vm-bento.s3.amazonaws.com/vagrant/opscode_ubuntu-12.04_provisionerless.box
suites:
- name: default
run_list: ["recipe[sendmail]"]
attributes: {}
9. Запускаем тест:
Видим что chef-client отработал без ошибок и пакет sendmail был успешно установлен.
После успешного выполнения инстанс удаляется.
В случае же ошибки, инстанс отстается запущеным.
Это сделано для того чтобы можно было проанализировать проблему внутри инстанса.
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 нам нужен для разрешения проблем с зависимостями кукбуков.
Т.к. мы его установили на прошлом этапе — приступаем к настройке:
1. Устанавливаем плагин для vagrant:
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)'!
2. Создаем проект chef-cook:
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
3. Запускаем установку(скорее всего данные gem уже стоят):
cd C:\kitchen\chef-cook && bundle install
4. Создаем кукбук:
mkdir C:\kitchen\chef-cook\cookbooks && cd C:\kitchen\chef-cook\cookbooks && berks cookbook mytest
5. Добавляем наш рецепт в runlist .kitchen.yml:
C:\kitchen\chef-cook\.kitchen.yml
---
suites:
- name: default
run_list: ["recipe[mytest]"]
attributes: {}
6. Запускаем тест:
и получаем ошибку:
для того чтобы её исправить нужно добавить в Berksfile следующую строку:
данная запись говорит где Berkshelf может найти данный кукбук.
C:\kitchen\chef-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.
1. Добавим в рецепт C:\kitchen\chef-cook\mytest\default.rb cледующую строку:
include_recipe 'sendmail'
2. А так же добавим в C:\kitchen\chef-cook\mytest\metadata.rb зависимость:
depends 'sendmail'
3. И наконец опять редактируем Berksfile и приводим к такому виду:
Т.е. мы добавили «cookbook 'sendmail'», данная запись говорит о том что в случае необходимости Berkshelf может скачать кукбук sendmail с комьюнити репозитория.
site :opscode
cookbook 'sendmail'
cookbook 'mytest', :path => 'cookbooks/mytest'
Т.е. мы добавили «cookbook 'sendmail'», данная запись говорит о том что в случае необходимости Berkshelf может скачать кукбук sendmail с комьюнити репозитория.
4. Проверяем работу нашего кукбука:
Из данного лога видно что кукбук sendmail успешно скачался и пакет sendmail был установлен.
C:\kitchen\chef-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 тут