Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Chef infra 自动属性(Ohai数据)何时更新?_Chef Infra - Fatal编程技术网

Chef infra 自动属性(Ohai数据)何时更新?

Chef infra 自动属性(Ohai数据)何时更新?,chef-infra,Chef Infra,从介绍中可以看出,“自动属性包含Ohai在每次chef客户端运行开始时识别的数据。自动属性不能修改,并且始终具有最高的属性优先级。” 据我了解: 无法修改自动属性 自动属性仅在chef客户端运行时更新 第一,这不是真的。我可以修改自动属性。例如,假设我想更改chef软件包的版本: require 'chef' Chef::Config.from_file(File.join('/home/chefuser', '.chef', 'knife.rb')) query = Chef::Search:

从介绍中可以看出,“自动属性包含Ohai在每次chef客户端运行开始时识别的数据。自动属性不能修改,并且始终具有最高的属性优先级。”

据我了解:

  • 无法修改自动属性
  • 自动属性仅在chef客户端运行时更新
  • 第一,这不是真的。我可以修改自动属性。例如,假设我想更改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会自动更改

    对于第二个问题,问题
    :它的确切含义是“在厨师长客户运行开始时”?如果chef客户端未运行,自动属性是否永远不会更新


    我认为一旦系统配置被更改,自动属性应该被更新。我想知道,即使不运行chef客户端,自动属性何时也会更新。

    在chef客户端运行的上下文中,无法修改自动属性。即使在保存的节点对象上设置了属性(代码就是这样做的),它也会在每次chef客户端运行开始时重置,ohai的值将覆盖它

    以下是chef客户端运行期间事件的大致顺序:

  • Chef从Chef服务器检索保存的节点对象(如果存在)
  • 它应用来自cookbooks/roles/recipes的任何属性覆盖
  • 它应用ohai提供的自动属性
  • 它使用此更新状态执行运行列表
  • 如果运行成功,它会将更新的节点对象保存在chef服务器上
  • 因此,如果您只需要在chef客户端运行中使用正确的自动属性,那么您不必做任何事情,因为这一切都是自动发生的


    编辑:您可以找到有关属性持久性和优先级的更多详细信息。

    我不会重新散列已经说过的内容,但是我会添加一个小技巧

    Ohai旨在描述机器的状态,因此不意味着用其他方式覆盖其属性。也就是说,Ohai可以更新自身

    在您的特定用例中,ohai gem中的ohai/plugins/chef定义了它在预编译执行期间看到的chef版本。它报告的值是正确的,chef client的值在下一次运行chef之前不会更改(尽管包已更新,但内存中的chef仍然是该版本)

    知道了这一点,如果您仍然希望更新版本,没有什么可以阻止您向包或脚本资源中添加针对以下资源定义的通知

    ohai 'chef' do
      action :reload
    end
    

    这将产生重新触发chef ohai插件的效果,从而更新chef version属性。

    如果使用-o(覆盖运行列表)运行chef客户端,则不会运行node.save。因此,ohai属性不会发送到Chef服务器


    只有在使用节点的默认运行列表时,ohai属性才会保存在Chef服务器上。

    您使用的是ohai插件吗?该插件旨在设置具有“自动”优先级的属性。虽然chef不会抛出错误这一点非常有趣,但您并不是要从chef菜谱中明确设置这些参数@Mark,Ohai是作为chef客户端安装过程的一部分安装的。我正在调查Ohai何时会更新属性,并试图找到一种方法,在不运行chef-client的情况下触发Ohai更新过程。正如avout所解释的,Ohai属性由Ohai在chef运行开始时设置。正如您所发现的,ohai是一个单独的可执行文件,可以单独定制。它旨在发现运行chef的平台的各个方面。这就是为什么它的属性值设计为不被覆盖。例如,如果厨师配方代码更改操作系统名称之类的内容(没有意义),这将是非常糟糕的。您无法设置Ohai属性。它们是自动的,并且具有最高的优先级。@Mark,是的,我完全同意你的看法。chef客户端首次运行后,将收集所有平台信息并注册到节点信息中。但之后,platfrom信息可能会更新,然后使用刀子搜索命令查找节点(通过Ohai属性/标准过滤,如chef客户端版本),结果可能会出错。因此,Ohai在某些情况下似乎有一些限制。下面是一个例子:我使用chef客户端执行一个菜谱,它将chef客户端更新到一个更新的版本(11.12.2)。在chef客户端运行之后,我希望看到chef客户端的版本应该是11.12.2。但结果是,通过使用“rpm-qa | grep chef”将chef客户机更新为较新版本,Ohai属性不会更新。因此,当我使用刀子搜索命令按chef客户端版本筛选节点时,它将得到错误的节点集。所以我认为Ohai属性应该在chef客户端运行之前和之后更新。