Chef:如何测试Chef Server上没有存储节点属性?

时间:2015-05-06 16:26:23

标签: rspec chef recipe chefspec

在一些厨师零运行(将节点状态保存为本地.json文件)后,我很遗憾在节点文件中找到它: ... "ssmtp": { "auth_username": "secret user name", "auth_password": "even-more-secret password" } Chef Server上的相同运行会将节点数据保存在服务器上。这当然是一个问题,我将不得不更换凭证,修改食谱等。我仍在调查导致这一点的原因,但我的问题是:

如何为配方创建rspec / chefspec测试以验证特定节点属性是否未永久保存在节点的.json文件或Chef服务器上?

我想将此添加到我的规格中,以确保它再也不会发生。

后记

这里的一个重要教训是,任何进入任何节点属性的方法最终都会保存在节点对象表示中。

2 个答案:

答案 0 :(得分:2)

Chef Server将保存所有属性,即使它们是正常或默认或其他优先级。您可以使用node.run_state来解决这个问题,elkstack可以用来“在厨师 - 客户端运行期间隐藏瞬态数据。”

您可以在_lumberjack_secrets.rb社区食谱中看到这一点,最明显的是save-widget食谱。

设置

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

答案 1 :(得分:0)

密钥位于Chef docs的注释中,&#34;普通属性是一个在节点对象中保留的设置。普通属性具有比默认属性更高的属性优先级。&#34; 如果属性是&#34;正常&#34;那么将问题分解为测试。属性。

深入研究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"

如果未设置特定值,您也可以测试,但我认为测试密钥不存在更重要。

不知怎的,我总是从简单地制定一个问题到这里发布的新见解。它就是这样。