这个厨师属性从何而来,为什么我无法改变它?

这个厨师属性从何而来,为什么我无法改变它?

当我更改角色时,厨师节点的属性不会被更新,旧值保持不变。

属性node['nagios']['custom_variables']['styleurl']未更新为 的新值/urlprefix,而是停留在旧值urlprefix。我一个多星期前就更改了角色定义。

另一个带有 chef-client 的节点(查看此属性的 nagios 服务器):

# chef-shell -z
chef > nodes.show("server2.example.com")['nagios']['custom_variables']['styleurl']
 => "urlprefix"

节点和角色定义(如下)不包括该值,而仅包括/urlprefix

debug_value告诉我这来自于覆盖。

chef > nodes.show("server2.example.com").debug_value("nagios", "custom_variables", "styleurl")
=> [["set_unless_enabled?", false], ["default", :not_present], ["env_default", :not_present], ["role_default", :not_present], ["force_default", :not_present], ["normal", :not_present], ["override", "osm"], ["role_override", :not_present], ["env_override", :not_present], ["force_override", :not_present], ["automatic", :not_present]] 

knife node show -l显示override该变量有一个。(请参阅下面的输出)。

我使用这些属性来配置我的 nagios 检查。Nagios 是用 chef 配置的,因此我的 nagios 检查显然失败了。

为什么我不能改变角色中的属性?为什么角色不能override_attribute呢?覆盖属性?我该如何更改此属性?

节点配置

简单的节点,一切都在角色中完成。

$ knife node show -Fjson server2.example.com
{
  "name": "server2.example.com",
  "chef_environment": "_default",
  "run_list": [
    "role[server2]"
  ],
  "normal": {
    "tags": []
  }
}

角色

只有 server2.example.com 具有该server2角色。所有操作均在角色中完成。这是唯一设置的位置styleurl

$ knife role show -Fjson server2
{
  "name": "server2",
  "description": "",
  "json_class": "Chef::Role",
  "default_attributes": {
  },
  "override_attributes": {
    "nagios": {
      "custom_variables": {
        "styleurl": "/urlprefix"
      }
    }
  },
  "chef_type": "role",
  "run_list": [
    "role[ubuntu-precise-basic]",
    "recipe[firewall::http]",
    "recipe[firewall::https]"
  ],
  "env_run_lists": {
  }
}

菜谱属性

custom_variables::styleurl在食谱中的任何地方都没有定义:

$ grep -R "custom_variables" cookbooks/
cookbooks/nagios/templates/default/hosts.cfg.erb:  <% if node['nagios'] && node['nagios']['custom_variables'] %>
cookbooks/nagios/templates/default/hosts.cfg.erb:  <% node['nagios']['custom_variables'].each do |key, value| -%>
cookbooks/nagios/templates/default/hosts.cfg.erb:  <% if n['nagios'] && n['nagios']['custom_variables'] %>
cookbooks/nagios/templates/default/hosts.cfg.erb:  <% n['nagios']['custom_variables'].each do |key, value| -%>
cookbooks/nagios/templates/default/hosts.cfg.erb:  <% if n['nagios'] && n['nagios']['custom_variables'] %>
cookbooks/nagios/templates/default/hosts.cfg.erb:  <% n['nagios']['custom_variables'].each do |key, value| -%>
$

knife node show

(部分内容已删除/编辑)

$ knife node show -Fjson  -l server2.example.com
{
  "name": "server2.example.com",
  "chef_environment": "_default",
  "run_list": [
    "role[server2]"
  ],
  "normal": {
    "tags": [

    ]
  },
  "override": {
    "nagios": {
      "custom_variables": {
        "styleurl": "osm"
      }
    }
  },
    ...
    "recipes": [
      "accounts",
      "packages::precise",
      "firewall::ssh",
      "firewall::munin",
      "firewall::nrpe",
      "munin::client",
      "munin-checks",
      "nrpe",
      "nagios-checks",
      "fail2ban",
      "openssh",
      "mycompany::apache_logrotate",
      "firewall::http",
      "firewall::https"
    ],
    "roles": [
      "server2",
      "ubuntu-precise-basic",
      "mycompany-accounts"
    ]
  }
}

Chef v11.8

答案1

chef-client发完这个问题后,我尝试直接在节点上运行server2.example.com。现在,knife 和其他节点可以看到正确的节点属性,问题已解决。

因此“chef-client在受影响的节点上运行”解决了这个问题。

答案2

进一步解释一下:节点对象包含两种数据。“所需状态”如运行列表和 Chef 环境通常由人工更新,因此它们始终是最新的。“当前状态”(主要以节点属性的形式)仅在成功聚合结束时保存在 Chef Server 中,以记录当时机器的状态。

相关内容