从http://docs.opscode.com/chef_overview_attributes.html#automatic-ohai的介绍中,它说“自动属性包含在每次厨师 - 客户端运行开始时由Ohai 识别的数据。自动属性不能被修改并始终具有最高的属性优先权。“
根据我的理解:
对于1号,这不是真的。我可以修改自动属性。例如,假设我想更改chef包的版本:
require 'chef'
Chef::Config.from_file(File.join('/home/chefuser', '.chef', 'knife.rb'))
query = Chef::Search::Query.new
# search a node by node name, test_machine in my case
nodes = query.search('node', "name:test_machine").first
nodes[0].automatic["chef_packages"]["chef"]["version"] = "11.12.2"
nodes[0].save
并使用
knife node show test_machine -l | grep version
厨师包的版本已更改。 问题:这是修改自动属性的正确方法吗?或者没有必要更改自动属性,因为Ohai会自动执行此操作?
对于数字2,问题:它在“厨师 - 客户端运行之初”的确切含义是什么?如果不运行chef-client,自动属性是否永远不会更新?
我认为一旦系统配置发生变化,就应该更新自动属性。我想知道即使没有运行chef-client也会更新自动属性。
答案 0 :(得分:2)
无法在Chef客户端运行的上下文中修改自动属性。即使您在保存的节点对象上设置了一个属性(这是您的代码正在执行的操作),它也会在每个主厨客户端运行开始时重置,而来自ohai的值将覆盖它。
以下是厨师客户运行期间的大致事件序列:
因此,如果您在Chef-client运行中只需要正确的自动属性,则无需执行任何操作,因为这一切都会自动发生。
编辑:您可以找到有关属性持久性和优先级here的更多详细信息。
答案 1 :(得分:1)
我不会重新讨论已经说过的内容,但是我会添加一个小节目。
Ohai意在描述机器的状态,因此并不意味着用其他方法覆盖它的属性。话虽这么说,Ohai可以更新 本身 。在您的特定用例中,来自ohai gem的ohai / plugins / chef定义了它在预编译执行期间看到的厨师版本。它报告的价值是正确的,厨师 - 客户的价值在下一次厨师运行之前不会改变(虽然包装更新了,内存厨师仍然是那个版本)。
知道如果您仍希望更新版本,那么就没有什么可以阻止您向您的包或脚本资源添加通知以实现以下资源定义
ohai 'chef' do
action :reload
end
这将重新触发chef ohai插件,从而更新Chef版本属性。
答案 2 :(得分:0)
如果使用-o(覆盖运行列表)运行chef-client,则不会运行node.save。因此,ohai属性不会发送到Chef服务器。
仅当使用节点的默认运行列表时,ohai属性才会保存在Chef Server上。