如何将 json_query 与整数一起使用

How to use json_query with integer

开发者社区您好!

我目前正在开发一些 Ansible 剧本来管理 Citrix NetScaler 配置,并希望就以下内容寻求一些帮助。我在名为 nsadc_config_file_textfsm_nsadc_vlan_binding_parsed

的变量文件中定义了以下数据结构
[
    {
        "bind_vlan_NotParsed": "",
        "bind_vlan_id": "1042",
        "bind_vlan_ifnum": "",
        "bind_vlan_ipaddress": "10.162.5.120",
        "bind_vlan_netmask": "255.255.255.128",
        "bind_vlan_ownergroup": "",
        "bind_vlan_tagged": "",
        "bind_vlan_td": ""
    },
    {
        "bind_vlan_NotParsed": "",
        "bind_vlan_id": "1050",
        "bind_vlan_ifnum": "",
        "bind_vlan_ipaddress": "10.162.5.250",
        "bind_vlan_netmask": "255.255.255.128",
        "bind_vlan_ownergroup": "",
        "bind_vlan_tagged": "",
        "bind_vlan_td": ""
    }
]

我想在 Jinja 文件中使用循环查询此 JSON 结构 json_query 以获取特定 VLAN ID 的记录:

{% if (nsadc_config_file_textfsm_nsadc_vlan_binding_parsed | json_query('[?bind_vlan_id == `' + item_0.add_vlan_id + '`]')) %}

但不幸的是,查询不起作用,我总是得到一个空的结果。变量 bind_vlan_idadd_vlan_id 都是整数,但根据我的理解, JSON 结构默认包含字符串 key:value 。我相信,这可能是问题的原因:整数与字符串。我已经尝试了很多方案,但没有运气。

 - json_query('[?bind_vlan_id == `' + item_0.add_vlan_id + '`]')
 - json_query('[?bind_vlan_id == `' + item_0.add_vlan_id | string + '`]')
 - json_query('[?bind_vlan_id == item_0.add_vlan_id]')
 - json_query('[?bind_vlan_id == item_0.add_vlan_id | string]')
 - json_query('[?bind_vlan_id == `item_0.add_vlan_id`]')
 - json_query('[?bind_vlan_id == ''item_0.add_vlan_id'']')

谁能给我指出正确的方向,json_query 在整数值作为条件的情况下应该如何工作?非常感谢您!

给定简化数据进行测试

    nsadc:
      - id: "1042"
        ipaddress: "10.162.5.120"
      - id: "1050"
        ipaddress: "10.162.5.250"

问:"循环获取特定 ID 的记录。"

A:将查询放入变量中。这将简化引用和转义。例如

- debug:
    msg: "{{ nsadc|json_query(query) }}"
  loop: ["1042", "1050", "9999"]
  vars:
    query: "[?id == '{{ item }}']"

给予

ok: [localhost] => (item=1042) => {
    "msg": [
        {
            "id": "1042",
            "ipaddress": "10.162.5.120"
        }
    ]
}
ok: [localhost] => (item=1050) => {
    "msg": [
        {
            "id": "1050",
            "ipaddress": "10.162.5.250"
        }
    ]
}
ok: [localhost] => (item=9999) => {
    "msg": []
}

  • 属性 id 不是整数
- debug:
    msg: "{{ nsadc.0.id|type_debug }}"

给予

    "msg": "AnsibleUnicode"

声明的整数不带引号。例如


        id: 1042

会给

    "msg": "int"

问:"Jinja 模板错误"

{% set query = '[?id == '{{ item_0.id }}']' %}

A:如果您坚持在 Jinja 中创建查询,则必须连接字符串。例如

    - debug:
        msg: >-
          {% set query = "[?id == '" ~ item_0.id ~ "']" %}
          {{ nsadc|json_query(query) }}
      vars:
        item_0:
          id: "1042"

给予

    "msg": " [{'id': '1042', 'ipaddress': '10.162.5.120'}]"