Ansible 如何使用json_查询过滤器提取等于一个值的所有项

Ansible 如何使用json_查询过滤器提取等于一个值的所有项,ansible,json-query,Ansible,Json Query,以下是我的json输出: { "kind": [ { "inventory": "", "inventory_sources": "", "job_templates": "", "workflow_job_templates": "104"

以下是我的json输出:

{
"kind": [
    {
        "inventory": "",
        "inventory_sources": "",
        "job_templates": "",
        "workflow_job_templates": "104"
    },
    {
        "inventory": "",
        "inventory_sources": "",
        "job_templates": "114",
        "workflow_job_templates": ""
    },
    {
        "inventory": "24",
        "inventory_sources": "",
        "job_templates": "",
        "workflow_job_templates": ""
    },
    {
        "inventory": "",
        "inventory_sources": "108",
        "job_templates": "",
        "workflow_job_templates": ""
    }
]
}

我想显示包含特定值的所有项目名称。 例如,我想显示包含“104”的项目名称是“工作流\作业\模板”

我测试了一些语法,但没有成功:

    - debug: 
      msg: "104 is {{kind|json_query(query)}}"
      vars:
        query: "[?*==`104`].workflow_job_templates"
我知道这样做是错误的,但有人能告诉我他会为自己做些什么吗

下面的任务

-调试:
msg:“{{item}}{{kind|
映射('dict2items')|
映射('json_query',query)|
展平}”
循环:[104114108,24]
变量:
查询:“[?to_string(value)==to_string({{item}')].key”
给予

msg:104['workflow\u job\u templates']
msg:114[“作业模板”]
msg:108[“库存来源”]
味精:24[“库存”]

(记录在案,暴力手段)

创建密钥的唯一列表

-设置事实:
my_keys:“{{my_keys}默认值([])+item.keys()| list}”
循环:“{kind}}”
-设定事实:
my_keys:“{{my_keys | unique}}”
给予

my_键:
-存货
-存货来源
-作业模板
-工作流\作业\模板
创建包含所有值的字典

-设置事实:
my_dict:“{my_dict | default({})| combine({item:values})}”
循环:{{my_keys}}”
变量:
查询:“[.{item}}”
值:“{kind | json_查询(查询)}”
给予

my_dict:
库存:
- ''
- ''
- '24'
- ''
存货来源:
- ''
- ''
- ''
- '108'
作业模板:
- ''
- '114'
- ''
- ''
工作流\作业\模板:
- '104'
- ''
- ''
- ''
然后查字典。比如说

-调试:
msg:{{item}{{my_dict | dict2items | json_query(query)}”
循环:[104114108,24]
变量:
查询:“[?值[?包含(@,{item}')]].key”
给予

msg:104['workflow\u job\u templates']
msg:114[“作业模板”]
msg:108[“库存来源”]
味精:24[“库存”]
(更新)

下面的任务

-调试:
msg:“{{item}}{{kind|
映射('dict2items')|
映射('json_query',query)|
展平}”
循环:[104114108,24]
变量:
查询:“[?to_string(value)==to_string({{item}')].key”
给予

msg:104['workflow\u job\u templates']
msg:114[“作业模板”]
msg:108[“库存来源”]
味精:24[“库存”]

(记录在案,暴力手段)

创建密钥的唯一列表

-设置事实:
my_keys:“{{my_keys}默认值([])+item.keys()| list}”
循环:“{kind}}”
-设定事实:
my_keys:“{{my_keys | unique}}”
给予

my_键:
-存货
-存货来源
-作业模板
-工作流\作业\模板
创建包含所有值的字典

-设置事实:
my_dict:“{my_dict | default({})| combine({item:values})}”
循环:{{my_keys}}”
变量:
查询:“[.{item}}”
值:“{kind | json_查询(查询)}”
给予

my_dict:
库存:
- ''
- ''
- '24'
- ''
存货来源:
- ''
- ''
- ''
- '108'
作业模板:
- ''
- '114'
- ''
- ''
工作流\作业\模板:
- '104'
- ''
- ''
- ''
然后查字典。比如说

-调试:
msg:{{item}{{my_dict | dict2items | json_query(query)}”
循环:[104114108,24]
变量:
查询:“[?值[?包含(@,{item}')]].key”
给予

msg:104['workflow\u job\u templates']
msg:114[“作业模板”]
msg:108[“库存来源”]
味精:24[“库存”]

json\u查询
可能是解决方案的一部分,但这里确实不需要

下面代码的解释:

  • dict2items
    过滤器应用于列表中的每个元素。这会将每个映射转换为
    {key:“key”,value:“value”}
    对的列表
  • 将给定的列表展平,以便将所有这些元素放到一个顶层
  • 选择值仅为“104”的元素
  • 提取列表中每个元素的
    属性
  • 使该列表唯一并对其排序
-name:显示值为104的所有元素
调试:
msg:{kind | map('dict2items')| flant | selectattr('value','=','104')| map(attribute='key')| unique | sort}
请注意,如果相同的键名与不同的值相同,但其中一个值是'104,则此解决方案将为您提供一个结果。根据您的上述数据,结果如下:

TASK [Display all element having a value of 104] ***************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "workflow_job_templates"
    ]
}

json\u query
可能是解决方案的一部分,但这里确实不需要

下面代码的解释:

  • dict2items
    过滤器应用于列表中的每个元素。这会将每个映射转换为
    {key:“key”,value:“value”}
    对的列表
  • 将给定的列表展平,以便将所有这些元素放到一个顶层
  • 选择值仅为“104”的元素
  • 提取列表中每个元素的
    属性
  • 使该列表唯一并对其排序
-name:显示值为104的所有元素
调试:
msg:{kind | map('dict2items')| flant | selectattr('value','=','104')| map(attribute='key')| unique | sort}
请注意,如果相同的键名与不同的值相同,但其中一个值是'104,则此解决方案将为您提供一个结果。根据您的上述数据,结果如下:

TASK [Display all element having a value of 104] ***************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "workflow_job_templates"
    ]
}
如果
TASK [output the element that matches 104] *************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "104"
    ]
}