【问题标题】:Using item in Ansible json_query在 Ansible json_query 中使用项目
【发布时间】:2020-08-10 22:00:28
【问题描述】:

我正在尝试遍历键列表以从某些 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

【问题讨论】:

    标签: json loops ansible


    【解决方案1】:

    您没有用任何 Jinja 分隔符包围 item 变量,因此它不会被解释。
    如果key 等于字符串'item' 而不是存储在变量item 中的字符串,则结束测试。

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

    【讨论】:

    • 非常感谢!有用!我正在使用 JMESPath 语法,似乎反引号用于字符串文字。我想我还有两个问题: 1. 为什么不把 {{ }} 放在查询变量的外面。 2. 为什么不能直接将query的值粘贴到json_query()中?
    【解决方案2】:

    给定数据

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

    预期结果是

      - name1
      - name3
    

    可以同时避免 loopjson_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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 2020-05-08
      • 2023-03-25
      • 2020-11-25
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      相关资源
      最近更新 更多