У меня есть шеф-повар, управляющий несколькими узлами. На сервере есть рецепты и пакеты данных с различными секретами. Я хотел бы внести изменения в один из рецептов и протестировать его только на одном узле: я не хочу, чтобы другие узлы обновляли и использовали измененный рецепт.
Решения, которые я изучил:
Тестовая кухня и др.
Тесты хороши, но есть некоторые детали, которые я не могу проверить без пакетов данных и других вещей, уникальных для сервера шеф-повара.
код rsync в / var / chef / cache / cookbooks
И беги chef-client --skip-cookbook-sync
Это не удается, потому что в исходном коде моей поваренной книги отсутствует metadata.json
и многое другое.
поднять версию поваренной книги, загрузить, отредактировать список выполнения узла
Сложно координировать одновременную работу нескольких разработчиков (особенно, если тестирование длится дни или недели). Есть также несколько сред вне моего контроля, и я не могу предположить, что все они привязаны к определенной версии кулинарной книги, которую я хочу изменить.
переименовать кулинарную книгу, загрузить на сервер, применить альтернативную роль к узлу
Это решение, которое я использую сейчас. Это утомительно, потому что изменение имени поваренной книги меняет имена любых ресурсов, которые оно определяет, поэтому мне придется немного отредактировать кулинарную книгу. Сохранение альтернативной роли, настроенной для использования переименованной кулинарной книги, также вызывает раздражение.
Я справился с этим, установив версию поваренной книги на что-то вроде 0.0.1 и заблокировав только целевую среду для этой версии - это позволяет избежать того, чтобы каждый с разблокированной средой принял новую поваренную книгу.
Если вам нужно, чтобы это был действительно конкретный узел, вы можете создать фиктивную кулинарную книгу, которая «зависит» от вашей конкретной поваренной книги 0.0.1, и назначить этот рецепт в качестве дополнительной записи в списке выполнения для узла. Пока контакт среды позволяет использовать старые кулинарные книги (т.е. <= x.y.z вместо = x.y.z), он заставит этот единственный узел использовать специальную кулинарную книгу.
Также посмотрите test-kitchen + chef-zero, чтобы протестировать функции сервера внутри кухни.
Если ваши тесты действительно длятся неделями, вы можете подумать о применении успешных идей из мира программной инженерии, таких как Переключатели функций. Таким образом, вы могли переключаться между старым и новым кодом, используя такие переключатели, реализованные с помощью атрибутов роли или тегов в Chef.
Однако, как и мы, мы также время от времени меняем среду отдельных узлов и ограничиваем производство к версии latest - 1
, В настоящее время я экспериментирую со следующим, что упрощает использование нескольких сред с одинаковыми настройками (нет гарантии, что это действительно хорошо работает, я еще не пробовал это в производстве):
# environments/production.rb
name "production"
env_cookbook_versions = {
"mysql" => "<= 6.0.18",
"extra-constrained" => "= 1.1.2"
}
env_default_attributes = {}
eval File.read("production_settings.rb")
Этот файл (который я загружаю через knife environment from file
) содержит некоторые конкретные ограничения, которые не выполняются для другой среды, например pre-production
, у которого нет вывода версии для extra-constrained
Кулинарная книга.
Наконец, production_settings.rb
(части, общие для всех этих сред (для меня я говорю только о production
и pre-production
, не намного больше)) может выглядеть так:
# environments/production_common.rb
env_cookbook_versions["foo"] = "= 0.0.1"
cookbook_versions(env_cookbook_versions)
env_default_attributes.merge!({
"rabbitmq" => {
"server" => "mq.example.org"
},
"base" => {
"flags" => {
"production" => true
}
}
})
default_attributes(env_default_attributes)
Как вы знаете, вам нужно быть осторожным при поиске других узлов в той же среде. Кроме того, я не совсем уверен, работает ли все это практически нормально. Вы должны убедиться, что каждая среда зависит от production_settings.rb
загружается после его изменения. Но, возможно, это дает вам некоторые идеи.
Кстати. относительно тестируемости без Chef-Server: я редко сталкиваюсь с вещами, которые не могу протестировать с помощью test-kitchen. Вы знаете, что вы также можете добавить пакеты данных а также другие подделки узлы в свою кулинарную книгу, чтобы протестировать код, использующий такие поисковые запросы?