【问题标题】:How to use json_query with integer如何将 json_query 与整数一起使用
【发布时间】:2020-11-30 23:58:12
【问题描述】:

开发者社区你好!

我目前正在开发一些 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_query 查询此 JSON 结构,以获取特定 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 应该如何工作?非常感谢您!

【问题讨论】:

标签: json ansible jinja2 json-query


【解决方案1】:

给定用于测试的简化数据

    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 }}']' %}

答:如果您坚持在 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'}]"

【讨论】:

  • 亲爱的弗拉基米尔!非常感谢您的及时答复。我尝试将项目放在双花括号之间,但是当我尝试运行它时,我仍然收到错误消息:模板字符串时出现模板错误:预期令牌'语句块结束',得到'{'。在 Jinja 文件中使用 json_query 时,上述方法是否也有效? {% set query = '[?bind_vlan_id == '{{ item_0.add_vlan_id }}']' %} {% if (nsadc_config_file_textfsm_nsadc_vlan_binding_parsed | json_query(query)) %}
  • 不客气。我添加了一个 Jinja 示例。如果您有其他问题,请打开新问题。
  • 完美运行!非常感谢你,弗拉基米尔!
猜你喜欢
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
相关资源
最近更新 更多