在Ansible json_query中使用项目

问题描述

我正在尝试遍历键列表以从json中获取关联名称:

- name: show names
  debug:
    msg: "{{ data.json | json_query(query) }}"
  vars:
    query: "[? key==item].name"
  with_items: "{{ keys.split() }}"

但是当我尝试运行它时,它永远无法正确显示。密钥正确,但是没有返回数据:

TASK [get_help_on_SO: show] 
ok: [localhost] => (item=Key1) => {
    "msg": []
}
ok: [localhost] => (item=Key2) => {
    "msg": []
}

手动输入代码效果很好,所以我的查询语法似乎是正确的:

query: "[? key==`Key1`].name"

TASK [get_help_on_SO : show] 
ok: [localhost] => (item=Key1) => {
    "msg": [
        "FooBar 1"
]
}
ok: [localhost] => (item=Key2) => {
    "msg": [
        "FooBar 1"
    ]
}

如何正确地将item传递到json_query中?

解决方法

您没有用任何Jinja分隔符将item变量括起来,因此不会对其进行解释。
您将结束测试key是否等于字符串'item',而不是等于存储在变量item中的字符串。

- name: show names
  debug:
    msg: "{{ data.json | json_query(query) }}"
  vars:
    query: "[?key==`{{ item }}`].name"
  with_items: "{{ keys.split() }}"
,

提供数据

    keys: 'key1 key3'
    data:
      json: [{
            "key": "key1","name": "name1"
            },{
            "key": "key2","name": "name2"
            },{
            "key": "key3","name": "name3"
            }
            ]

预期结果是

  - name1
  - name3

可以避免同时出现 loop json_query 并简化解决方案。下面的任务

    - name: show names
      debug:
        msg: "{{ data.json|
                 selectattr('key','in',my_keys)|
                 map(attribute='name')|
                 list }}"
      vars:
        my_keys: "{{ keys.split() }}"

给予

  msg:
  - name1
  - name3

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...