json_query 过滤器有错误?
json_query filter with bug?
我有个情况。
当我尝试在 ansible-playbook return 中使用 json_query 过滤器时出现此错误:
{"msg": "Error in jmespath.search in json_query filter plugin:\ninvalid literal for int() with base 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
全文
I solve this with replace ('-','_')
filter.
这实际上是非常危险的,因为这会在输入、标识符和值中的任何地方用破折号代替下划线。但是,如果我们现在查看生成的 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 }}"
我有个情况。
当我尝试在 ansible-playbook return 中使用 json_query 过滤器时出现此错误:
{"msg": "Error in jmespath.search in json_query filter plugin:\ninvalid literal for int() with base 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
全文
I solve this with
replace ('-','_')
filter.
这实际上是非常危险的,因为这会在输入、标识符和值中的任何地方用破折号代替下划线。但是,如果我们现在查看生成的 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 }}"