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"

Вы также можете проверить это, если определенное значение не задано, но я думаю, что проверка того, что ключ не существует, более важна.

Почему-то я всегда получаю новые идеи от простого формулирования вопроса, чтобы опубликовать здесь.Такие вот дела.

Другие вопросы по тегам