2

我创建了用于启用某些 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 search node "WindowsFeature_Installed:true"

为了进一步调试,已启用命令的详细输出,并且来自 chef-server 的所有 HTTP 响应都正常。

此外,尝试检查 chef-server 日志以获取错误详细信息。但由于存在与 chef-server 包相关的许多进程日志,因此无法识别问题。

那么,如何删除此属性以再次执行配方操作?或者将在哪个厨师服务器日志中记录节点属性删除详细信息?任何指针都会有所帮助。

4

1 回答 1

3

我有一个类似的问题。我无法从节点中删除属性,但可以通过set进行修改。帮助我解决这个问题的是查看属性是由我的一个食谱生成的级别。

例如,要删除属性“network_interfaces”,请查看您当前的注释配置。

knife node show -l -F json <node_name>

您应该从您的节点配置中获得类似的输出:

{
  "name": "<node_name>",
  "chef_environment": "_default",
  "run_list": [
   ...
  ],
  "normal": {
     "tags": [
     ],
    "network_interfaces": {
       "order": [
         "vpn_vpn"
       ]
    },
  },
  "default": {
     ...
  },
  ...

就我而言,我想从所有节点中删除network_interfaces -attribute。所以我执行了:

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

一篇关于使用刀查询节点属性的精彩文章:http: //www.programmersparadox.com/2013/02/05/viewing-chef-node-attributes-with-knife/

于 2014-06-20T14:49:53.910 回答