Тестирование ролей и окружений шеф-повара
Я новичок в Chef и использую Test Kitchen, чтобы проверить достоверность моих кулинарных книг, что прекрасно работает. Теперь я пытаюсь убедиться, что специфичные для среды атрибуты верны на производственных узлах до первоначального запуска Chef. Они будут определены в роли.
Например, у меня могут быть рецепты, которые сходятся, используя поле Vagrant с настройками dev, которое проверяет кулинарную книгу. Я хочу иметь возможность проверить роль производственного узла. Я думаю, что я хочу эти тесты как источник правды, описывающей мою среду. Глядя на документацию Test Kitchen, кажется, что это выходит за рамки.
Правильно ли мое предположение? Есть ли лучший подход для проверки поваренной книги перед первым запуском Chef на рабочем узле, чтобы убедиться, что он имеет правильные настройки?
3 ответа
Я приятно обнаружил, что chef_zero использует каталог "test/ интеграции" в качестве хранилища chef.
Просто создайте свои роли под
- тест / интеграция / роли
пример
Стандартная компоновка поваренной книги шеф-повара.
├── attributes
│ └── default.rb
├── Berksfile
├── Berksfile.lock
├── chefignore
├── .kitchen.yml
├── metadata.rb
├── README.md
├── recipes
│ └── default.rb
└── test
└── integration
├── default
│ └── serverspec
│ ├── default_spec.rb
│ └── spec_helper.rb
└── roles
└── demo.json
.kitchen.yml
---
driver:
name: vagrant
provisioner:
name: chef_zero
platforms:
- name: ubuntu-14.04
suites:
- name: default
run_list:
- role[demo]
attributes:
Заметки:
- Поставщик - chef_zero
- Runlist настроен на использование роли
Рецепты / default.rb
file "/opt/helloworld.txt" do
content "#{node['demo']['greeting']}"
end
Атрибуты / default.rb
default['demo']['greeting'] = "hello world"
Заметки:
- Поваренная книга не будет компилироваться без значения по умолчанию
тест / интеграция / по умолчанию /serverspec/default_spec.rb
require 'spec_helper'
describe file('/opt/helloworld.txt') do
it { should be_file }
its(:content) { should match /this came from my role/ }
end
Заметки:
- Интеграционный тест ищет содержимое, заданное атрибутом роли
тест / интеграция / роли /demo.json
{
"name": "demo",
"default_attributes": {
"demo": {
"greeting": "this came from my role"
}
},
"run_list": [
"recipe[demo]"
]
}
Вы можете установить как роли, так и окружение в вашем.kitchen.yml, так что вы можете проверить это с помощью тестовой кухни.
....
provisioner:
roles_path: path/to/your/role/files
client_rb:
environment: your_environment
.....
Тем не менее, я лично предпочитаю использовать ролевые кулинарные книги. Если у вас есть фиксированный набор сред, как у нас, то вы также можете использовать простые условные выражения в файлах атрибутов вашей поваренной книги роли, чтобы также настраивать атрибуты в зависимости от среды. Таким образом, у вас есть одна поваренная книга, которая определяет всю конфигурацию вашего узла, оборачивая другие поваренные книги и устанавливая переменные. С этой настройкой очень легко настроить кухонные тесты, которые подтверждают точную производственную систему.
Когда вы приступаете к проверке атрибутов, частью тестовой кухни, которую вы должны использовать, является ChefSpec.
Вы можете определить полный список выполнения в файле спецификации и убедиться, что отображаемые файлы верны.
Здесь есть часть документации Chefspec.
Еще один способ сделать это - иметь "поваренную книгу ролей", вместо того, чтобы использовать роль на сервере chef, вы определяете атрибуты, которые вы хотите определить в файле атрибутов, и делаете эту поваренную книгу зависимой от того, каким будет исполняемый список ролей.
Этот рецепт роли поваренной книги будет иметь include_recipe
только ссылаясь на рецепт, который вы установили в списке выполнения ролей.
Основным преимуществом здесь является то, что вы можете включить свои спецификации в эту кулинарную книгу независимо от упомянутых кулинарных книг.