我创建了cookbook,用于启用某些Windows功能并使用WindowsRebootHandler重新启动计算机。如下面的代码所示,我使用ruby_block在后续运行中不执行相同的操作。
windows_batch 'Enable_MS_Feature' do
code <<-EOH
#My script
EOH
notifies :create, "ruby_block[WindowsFeature_Install]", :immediately
notifies :request, 'windows_reboot[60]'
not_if { node.attribute?("WindowsFeature_Installed") }
end
ruby_block "WindowsFeature_Install" do
block do
node.set['WindowsFeature_Installed'] = true
node.save
end
action :nothing
end
出于测试目的,我必须删除WindowsFeature_Installed
属性才能再次执行操作。所以,我使用了以下命令。
knife exec -E "nodes.transform(:all) {|n| n.delete('WindowsFeature_Installed');n.save() }"
上面的命令不是删除节点属性。当我使用knife命令搜索相同的属性时,它列出了所有节点。
knife search node "WindowsFeature_Installed:true"
要进一步调试,已启用命令的详细输出,并且来自chef-server的所有HTTP响应都正常。
此外,尝试检查chef-server日志以获取错误详细信息。但无法识别问题,因为存在与chef-server软件包相关的许多进程日志。
那么,如何删除此属性以再次执行配方操作?或者在哪个厨师服务器日志中,将记录节点属性删除详细信息?任何指针都会有所帮助。
答案 0 :(得分:3)
我有类似的问题。我无法从节点删除属性,但通过 set 进行修改。帮助我解决这个问题的方法是查看我的一个食谱生成属性的级别。
例如删除属性&#34; network_interfaces&#34;看看你当前的笔记配置。
knife node show -l -F json <node_name>
你应该从nodes-config获得类似的输出:
{
"name": "<node_name>",
"chef_environment": "_default",
"run_list": [
...
],
"normal": {
"tags": [
],
"network_interfaces": {
"order": [
"vpn_vpn"
]
},
},
"default": {
...
},
...
在我的情况下,我想从所有节点中删除 network_interfaces - 属性。所以我执行了:
knife exec -E 'nodes.transform(:all) { |n| n.normal_attrs.delete("network_interfaces"); n.save() }'
而不是:
knife exec -E 'nodes.transform(:all) { |n| n.delete("network_interfaces"); n.save() }'
有关不同属性优先级的更多信息,请访问:https://coderwall.com/p/rfm4lg
一篇关于使用knife查询节点属性的好文章:http://www.programmersparadox.com/2013/02/05/viewing-chef-node-attributes-with-knife/