如何在 Chef Search API 中过滤结果
How to filter results in Chef Search API
Chef 节点 API,如 /nodes/nodename 将 return 全节点对象如:
{
"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 来仅 return 一些必需的列而不是完整的节点对象。例如:
Chef::Search::Query.new("server url").search(:node, '*:*', :filter_result => {'name' => ['name'] } )
仅 return 节点名称有效,但当我尝试添加覆盖数据时,它总是 return null...
Chef::Search::Query.new("server url").search(:node, '*:*', :filter_result => {'name' => ['name'], 'override' => ['override'] } )
似乎 filter_result 可以用于字符串或数组等类型,但覆盖是一个 json 对象,如何将其包含在结果中?
谢谢!
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 节点 API,如 /nodes/nodename 将 return 全节点对象如:
{
"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 来仅 return 一些必需的列而不是完整的节点对象。例如:
Chef::Search::Query.new("server url").search(:node, '*:*', :filter_result => {'name' => ['name'] } )
仅 return 节点名称有效,但当我尝试添加覆盖数据时,它总是 return null...
Chef::Search::Query.new("server url").search(:node, '*:*', :filter_result => {'name' => ['name'], 'override' => ['override'] } )
似乎 filter_result 可以用于字符串或数组等类型,但覆盖是一个 json 对象,如何将其包含在结果中?
谢谢!
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"}]