Pull to refresh
EPAM
Компания для карьерного и профессионального роста

Test Kitchen для новичков

Reading time 8 min
Views 8.6K
image Привет, Хабраюзеры! Сегодня я хотел бы рассказать о инструментах, которые облегчают тестирование кукбуков. В чем собственно проблема? С ростом масштаба инфраструктуры становится сложнее следить за зависимостями и последствиями внесения изменений в кукбуки и на повестке дня становится вопрос о их тестировании. Решить данные проблемы помогают такие инструменты, как 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:

1. Создаем папку для нашего тестового инстанса:

mkdir C:\vagrant && cd C:\vagrant

2. Добавляем precise32 box:

C:\vagrant>vagrant box add precise32 files.vagrantup.com/precise32.box
Downloading box from URL: files.vagrantup.com/precise32.box
Extracting box...ate: 3089k/s, Estimated time remaining: --:--:--)
Successfully added box 'precise32' with provider 'virtualbox'!

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 :

login as: vagrant
vagrant@localhost's password: vagrant
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic-pae i686)
* Documentation: 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) иначе могут возникнуть проблемы.
Для установки проделываем следующие шаги:

1. Создаем папку:
mkdir C:\devkit && cd C:\devkit

2. Скачиваем в нее архив и распаковываем его в текущую директорию:
DevKit-tdm
cd C:\devkit

3. Инициализируем установку:
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. Устанавливаем:

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. Запускаем тест:

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. Запускаем тест:
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 и приводим к такому виду:

site :opscode
cookbook 'sendmail'
cookbook 'mytest', :path => 'cookbooks/mytest'

Т.е. мы добавили «cookbook 'sendmail'», данная запись говорит о том что в случае необходимости Berkshelf может скачать кукбук sendmail с комьюнити репозитория.

4. Проверяем работу нашего кукбука:
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 тут
Tags:
Hubs:
+6
Comments 4
Comments Comments 4

Articles

Information

Website
www.epam.com
Registered
Founded
1993
Employees
over 10,000 employees
Location
США
Representative
vesyolkinaolga