Rspec Chef:如何测试节点属性是否未存储在Chef服务器上?

Rspec Chef:如何测试节点属性是否未存储在Chef服务器上?,rspec,chef-infra,recipe,chefspec,Rspec,Chef Infra,Recipe,Chefspec,在一些chef zero运行(将节点状态保存为local.json文件)之后,我在节点文件中发现了以下内容: ... “ssmtp”:{ “身份验证用户名”:“机密用户名”, “验证密码”:“更秘密的密码” } 在Chef服务器上运行的相同操作将在服务器上保存节点数据。这当然是一个问题,我将不得不更换凭证、修改配方等。我仍在调查导致这一问题的原因,但我的问题是: 如何为配方创建rspec/chefspec测试,以验证特定节点属性未持久保存在节点的.json文件或Chef服务器上? 我想将此添

在一些chef zero运行(将节点状态保存为local.json文件)之后,我在节点文件中发现了以下内容:

...
“ssmtp”:{
“身份验证用户名”:“机密用户名”,
“验证密码”:“更秘密的密码”
}
在Chef服务器上运行的相同操作将在服务器上保存节点数据。这当然是一个问题,我将不得不更换凭证、修改配方等。我仍在调查导致这一问题的原因,但我的问题是:

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

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

后记
这里的重要教训是,任何进入任何节点属性的内容最终都会保存在节点对象表示中。

关键在于来自Chef文档的注释,“正常属性是一种在节点对象中持续存在的设置。正常属性的属性优先级高于默认属性。”这将问题分解为测试属性是否为“正常”属性

深入研究Chef::Node和Chef::Node::Attribute类代码,我发现您可以调用
Node.attributes.normal
来获取普通属性。因此,这个简明测试正确地失败了,表明我的秘密信息将永久存储在Node对象中


它“没有正常的属性节点[ssmtp][auth_password]”是否
预期(subject.node.attributes.normal['ssmtp'].keys)。不包括“身份验证密码”
结束

导致此错误消息:


失败/错误:预期(subject.node.attributes.normal['ssmtp'].keys)。不包括“验证密码”
预期[“身份验证用户名”、“身份验证密码”]不包括“身份验证密码”

如果没有设置特定的值,您也可以进行测试,但我认为测试键不存在更切题


不知何故,我总是能从简单地提出一个问题到这里来获得新的见解。事实就是如此。

Chef Server将保存所有属性,即使它们是正常的、默认的或其他优先级。您可以通过使用它来绕过这个问题,它可以用于“在Chef客户端运行期间隐藏临时数据”

你可以在社区食谱中看到这一点,尤其是在食谱中

节点。正在设置的运行状态

if <CONDITION ABBREVIATED>
  node.run_state['lumberjack_decoded_key'] = Base64.decode64(lumberjack_secrets['key'])
  ....
end
至于测试,我自己还没有“测试”这个,但是您将进行测试以确保属性没有设置,如下所示:

it 'should not have secret attributes set' do
  node = chef_run.node
  expect (node['my_secret']).to be_nil
end

Per Chef node docs:“正常属性是节点对象中持续存在的设置。普通属性的属性优先级高于默认属性。”因此,我的问题可能是“如何测试节点属性是否为普通属性?您还可以尝试禁止将此节点属性保存到chef服务器。见:老鼠@马特巴洛是对的。我的“解决方案”只是将问题转移到节点对象表示的另一部分。现在是默认属性,而不是普通属性。D'ohWorth noting
节点。普通['attribute']
将给出相同的行为。(通过
normal
节点的方法访问
node
而不是通过方法访问hash,你不应该将方法和字符串访问
node['attributes']['normal']['ssmtp']混合在一起。键
将具有最清晰的含义。谢谢你的解释。(雾散了)因此,在高级别上,如果没有在存储的节点对象中结束凭据,就不可能使用节点属性来设置ssmtp(使用标准烹饪书)。我接受这一点:“Chef Server将保存所有属性,即使它们是正常、默认或其他优先级别。”作为实际答案。
it 'should not have secret attributes set' do
  node = chef_run.node
  expect (node['my_secret']).to be_nil
end