当我更改角色时,厨师节点的属性不会被更新,旧值保持不变。
属性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 中,以记录当时机器的状态。