【问题标题】:How to filter results in Chef Search API如何在 Chef Search API 中过滤结果
【发布时间】:2016-03-30 07:52:26
【问题描述】:

Chef Node API,如 /nodes/nodename 将返回完整的节点对象,如:

{
  "name": "node_name",
  "chef_environment": "_default",
  "run_list": [
    "recipe[recipe_name]"
  ]
  "json_class": "Chef::Node",
  "chef_type": "node",
  "automatic": { ... },
  "normal": { "tags": [ ] },
  "default": { },
  "override": { "cookbook1_name"=>{
                    "attribute1"=>"overridevalue"
              }}
}

我正在尝试使用 Chef::Search::Query.search REST API 来仅返回一些必需的列而不是完整的节点对象。例如:

Chef::Search::Query.new("server url").search(:node, '*:*', :filter_result => {'name' => ['name'] } )

它只返回节点名称,但是当我尝试添加覆盖数据时,它总是返回 null...

Chef::Search::Query.new("server url").search(:node, '*:*', :filter_result => {'name' => ['name'], 'override' => ['override'] } )

filter_result 似乎可以用于字符串或数组等类型,但 override 是一个 json 对象,如何将其包含在结果中?

谢谢!

【问题讨论】:

    标签: rest search filter chef-infra


    【解决方案1】:

    et filter_result 中的关键路径是针对合并的属性形式运行的。你会想要像'attribute1' => ['cookbook1_name', 'attribute1'] 这样的东西。

    编辑:

    举个直接的例子:

    $ knife node show foo -z -l -Fj
    {
      "name": "foo",
      "chef_environment": "_default",
      "run_list": [
    
    ]
    ,
      "normal": {
    
      },
      "default": {
    
      },
      "override": {
        "key1": {
          "key2": "value"
        }
      },
      "automatic": {
    
      }
    }
    $ knife exec -z -E 'puts search(:node, "*:*").inspect'
    [#<Chef::Node:0x007f89e3ee97f0 @chef_server_rest=nil, @name="foo", @chef_environment="_default", @primary_runlist=#<Chef::RunList:0x007f89e3ee9728 @run_list_items=[]>, @override_runlist=#<Chef::RunList:0x007f89e3ee9660 @run_list_items=[]>, @policy_name=nil, @policy_group=nil, @attributes=#<Chef::Node::Attribute @default={}, @env_default={}, @role_default={}, @force_default={}, @normal={}, @override={"key1"=>{"key2"=>"value"}}, @role_override={}, @env_override={}, @force_override={}, @automatic={}, @merged_attributes=nil, @properties=nil>, @run_state={}>]
    $ knife exec -z -E 'puts search(:node, "*:*", filter_result: {myval: %w{key1 key2}}).inspect'
    [{"myval"=>"value"}]
    

    【讨论】:

    • 谢谢!我试图从 Chef REST API 中转储节点属性,我发现在 Node 对象中,有 name、chef_environment、override、default 和 automatic 等属性,在我的实验中,似乎 filter_result 只能支持自动中的子属性(如主机名、fqdn、角色等)和其他简单类型的属性,如 chef_environment、名称,但无法访问覆盖属性。
    • 这不正确,您只是使用了错误的代码。所有属性都应该适用于系统。
    • 你能帮忙分享一个可运行的查询来获取节点的覆盖值吗?谢谢!
    • 再一次,您不能特别地获得覆盖值,但它对整个合并对象进行操作,因此只需像往常一样访问它。
    • 感谢您的代码!就我而言,这对我来说有点困难,因为 key1 和 key2 将是非常动态的......无论如何,非常感谢!
    猜你喜欢
    • 2016-12-17
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多