json_query 过滤器有错误?

问题描述

我有一个情况。

当我尝试在 ansible-playbook 中使用 json_query 过滤器时返回此错误

{"msg": "json_query 过滤器插件中的 jmespath.search 错误:\nint() 的文本无效,基数为 10:'-'"}

我用 replace ('-','_') 过滤器解决了这个问题。

我有其他方法可以解决这个问题吗?

完整代码在这里

---
# tasks file for mpls-lsp

- name: Colete informações do protocolo osfp
  junipernetworks.junos.junos_rpc:
    rpc: get-ospf-neighbor-information
    output: json
  register:
    _data

- name: Aplica as configurações padrão em RT-BRAS.*
  ansible.builtin.debug:
    var: item
  loop: "{{ _data2 | json_query('ospf_neighbor_information[0].ospf_neighbor[*].neighbor_address[0].data') }}"
  vars:
    _data2: "{{ _data.output | replace ('-','_') }}"
  when: "'device_roles_bras' in {{ group_names }}"

解决方法

TL;DR

"ospf-neighbor-information"[0]."ospf-neighbor"[*]."neighbor-address"[0].data

完整故事

我用 replace ('-','_') 过滤器解决了这个问题。

这实际上非常危险,因为这会在输入、标识符和值的任何地方替换下划线的破折号。但是如果我们现在看看你得到的 jmespath 表达式

json_query('ospf_neighbor_information[0].ospf_neighbor[*].neighbor_address[0].data')

我们可以推断您之前使用 - 作为分隔符的所有标识符

在上面的表达式中,您使用的是不带引号的标识符。如果您查看 jmespath specification for identifiers,您会看到未加引号的不能包含破折号。

identifier        = unquoted-string / quoted-string
unquoted-string   = (%x41-5A / %x61-7A / %x5F) *(  ; A-Za-z_
                       %x30-39  /  ; 0-9
                       %x41-5A /  ; A-Z
                       %x5F    /  ; _
                       %x61-7A)   ; a-z
quoted-string     = quote 1*(unescaped-char / escaped-char) quote
unescaped-char    = %x20-21 / %x23-5B / %x5D-10FFFF
escape            = %x5C   ; Back slash: \
quote             = %x22   ; Double quote: '"'
escaped-char      = escape (
                       %x22 /          ; "    quotation mark  U+0022
                       %x5C /          ; \    reverse solidus U+005C
                       %x2F /          ; /    solidus         U+002F
                       %x62 /          ; b    backspace       U+0008
                       %x66 /          ; f    form feed       U+000C
                       %x6E /          ; n    line feed       U+000A
                       %x72 /          ; r    carriage return U+000D
                       %x74 /          ; t    tab             U+0009
                       %x75 4HEXDIG )  ; uXXXX                U+XXXX

所以如果你的标识符包含破折号,你必须引用它们(并注意引用标识符是用双引号引起的)

您可以按如下方式转换您的 json_query 任务,使其适用于您的原始数据(您可能需要进行调整,因为我没有您的原始结构并且不得不猜测...)>

- name: Aplica as configurações padrão em RT-BRAS.*
  ansible.builtin.debug:
    var: item
  loop: "{{ _data.output | json_query(query) }}"
  vars:
    query: >-
      "ospf-neighbor-information"[0]."ospf-neighbor"[*]."neighbor-address"[0].data
  when: "'device_roles_bras' in {{ group_names }}"

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...