Chef: Как проверить, что атрибут узла не хранится на Chef Server?
После некоторого запуска шеф-повара (который сохраняет состояние узла как локальные файлы.json) я был встревожен, обнаружив это в файлах узла:
...
"ssmtp": {
"auth_username": "secret user name",
"auth_password": "even-more-secret password"
}
Те же самые работы на Chef Server сохранят данные об узлах на сервере. Это, конечно, проблема, и мне придется заменить учетные данные, изменить рецепты и т. Д. Я все еще исследую, что вызвало это в первую очередь, но мой вопрос:
Как я могу создать тест rspec/chefspec для рецепта, чтобы убедиться, что определенный атрибут узла НЕ сохраняется в файле узла.json или на Chef Server?
Я хотел бы добавить это в мои спецификации, чтобы убедиться, что это никогда не повторится.
эпилог
Большой урок здесь заключается в том, что все, что попадает в любой атрибут узла, в конечном итоге сохраняется в представлении объекта узла.
2 ответа
Сервер Chef сохранит все атрибуты, даже если они являются нормальными или используются по умолчанию или имеют другой уровень приоритета. Вы можете обойти это, используя node.run_state, который можно использовать для "хранения временных данных во время выполнения программы chef-client".
Вы можете увидеть это на работе в кулинарной книге сообщества elkstack, особенно в рецепте _lumberjack_secrets.rb.
node.run_state
устанавливается:
if <CONDITION ABBREVIATED>
node.run_state['lumberjack_decoded_key'] = Base64.decode64(lumberjack_secrets['key'])
....
end
node.run_state
использовался:
lumberjack_keypair = node.run_state['lumberjack_decoded_key'] && node.run_state['lumberjack_decoded_certificate']
Что касается теста, я сам не "тестировал" это, но вы бы тестировали, чтобы убедиться, что атрибут не установлен, например так:
it 'should not have secret attributes set' do
node = chef_run.node
expect (node['my_secret']).to be_nil
end
Ключ в комментарии из документа Chef: "Обычный атрибут - это параметр, который сохраняется в объекте узла. Обычный атрибут имеет более высокий приоритет атрибута, чем атрибут по умолчанию". Это разбивает проблему на тестирование, если атрибут является "нормальным" атрибутом.
Копаясь в коде класса Chef::Node и Chef::Node::Attribute, я нашел, что вы можете позвонить node.attributes.normal
чтобы получить только нормальные атрибуты. Так что этот краткий тест не пройден правильно, указывая на то, что моя секретная информация будет постоянно храниться в объекте узла!
it 'does not have a normal attribute node[ssmtp][auth_password]' do
expect(subject.node.attributes.normal['ssmtp'].keys).to_not include 'auth_password'
end
в результате этого приличное сообщение об ошибке:
Failure/Error: expect(subject.node.attributes.normal['ssmtp'].keys).to_not include 'auth_password'
expected ["auth_username", "auth_password"] not to include "auth_password"
Вы также можете проверить это, если определенное значение не задано, но я думаю, что проверка того, что ключ не существует, более важна.
Почему-то я всегда получаю новые идеи от простого формулирования вопроса, чтобы опубликовать здесь.Такие вот дела.