gpt4 book ai didi

Ansible : filter elements containing string with JMESPath

转载 作者:行者123 更新时间:2023-12-04 01:10:15 24 4
gpt4 key购买 nike

我想获取已定义接口(interface)类型的地址列表。
我找到了一些信息 here .
这是我的剧本:

- name: Test JMESPath
hosts: localhost
gather_facts: no

vars:
interfaces:
- name: em0
address: 10.127.37.89/29
- name: bge0
address: 10.112.171.81/28
- name: bge1
address: 10.112.171.65/28
- name: bge2
address: 10.112.171.97/28
tasks:
- name: JMESPath query
set_fact:
result: "{{ interfaces | json_query(query) }}"
vars:
query: "[?name.contains(@, 'bge')].address"

- debug:
var: result
我想得到:
[
"10.112.171.81/28",
"10.112.171.65/28",
"10.112.171.97/28"
]
它适用于 JMESPath 网站,但我的剧本失败了:
ansible-playbook play-testJMESPath.yml [WARNING]: provided hosts list
is empty, only localhost is available. Note that the implicit
localhost does not match 'all'

PLAY [Test JMESPath]
**************************************************************************************************************************************************************************************************

TASK [JMESPath query]
************************************************************************************************************************************************************************************************* fatal: [localhost]: FAILED! => {"msg": "JMESPathError in json_query
filter plugin:\nIn function contains(), invalid type for value:
external, expected one of: ['array', 'string'], received:
\"unknown\""}

PLAY RECAP
************************************************************************************************************************************************************************************************************ localhost : ok=0 changed=0 unreachable=0
failed=1 skipped=0 rescued=0 ignored=0

有人可以解释我为什么吗?

最佳答案

对于您看到的 JMESPath 问题,此处对此进行了解释:

The problem is related to the fact that Ansible uses own types for strings: AnsibleUnicode and AnsibleUnsafeText.And as long as jmespath library has very strict type-checking, it fails to accept this types as string literals.


来源: https://github.com/ansible/ansible/issues/27299#issuecomment-331068246

把戏如同一期所述,要使其正常工作,是使用 to_json | from_json过滤器对,以强制返回正确的类型。
所以,剧本:
- hosts: localhost
gather_facts: no

tasks:
- debug:
msg: "{{ interfaces | to_json | from_json | json_query(query) }}"
vars:
query: "[?name.contains(@, 'bge')].address"
interfaces:
- name: em0
address: 10.127.37.89/29
- name: bge0
address: 10.112.171.81/28
- name: bge1
address: 10.112.171.65/28
- name: bge2
address: 10.112.171.97/28
给出预期:
TASK [debug] *****************************************************************************************************
ok: [localhost] => {
"msg": [
"10.112.171.81/28",
"10.112.171.65/28",
"10.112.171.97/28"
]
}

PLAY RECAP *******************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

关于Ansible : filter elements containing string with JMESPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65094976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com