当自动属性(Ohai数据)得到更新?

时间:2014-04-21 19:17:19

标签: chef

http://docs.opscode.com/chef_overview_attributes.html#automatic-ohai的介绍中,它说“自动属性包含在每次厨师 - 客户端运行开始时由Ohai 识别的数据。自动属性不能被修改并始终具有最高的属性优先权。“

根据我的理解:

  1. 无法修改自动属性。
  2. 仅当chef-client运行时才更新自动属性
  3. 对于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也会更新自动属性。

3 个答案:

答案 0 :(得分:2)

无法在Chef客户端运行的上下文中修改自动属性。即使您在保存的节点对象上设置了一个属性(这是您的代码正在执行的操作),它也会在每个主厨客户端运行开始时重置,而来自ohai的值将覆盖它。

以下是厨师客户运行期间的大致事件序列:

  1. Chef从Chef服务器(如果存在)中检索已保存的节点对象
  2. 它应用cookbook / roles / recipes
  3. 中的任何属性覆盖
  4. 它应用ohai提供的自动属性
  5. 使用此更新状态执行运行列表
  6. 如果运行成功,它会将更新的节点对象保存在Chef服务器上
  7. 因此,如果您在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上。