ansible - 在ansible中使用json_query组合属性值
问题描述
我想使用 ansible
示例数据中的 json_query 将两个属性组合成由分隔符分隔的单个字符串
{
"locations": [
{"name": "Seattle", "state": "WA"},
{"name": "New York", "state": "NY"},
{"name": "Bellevue", "state": "WA"},
{"name": "Olympia", "state": "WA"}
]
}
如上面的数据集所示,我正在尝试过滤状态“WA”,执行输出为:
[
"Seattle-WA",
"Bellevue-WA",
"Olympia-WA"
]
我现在尝试过的:
- debug:
msg: "{{ chart_list.HELM_CHARTS | json_query(\"[?state == 'WA'].{name:name,state:state}\") }}"
Output:
[
{
"name": "Seattle",
"state": "WA"
},
{
"name": "Bellevue",
"state": "WA"
},
{
"name": "Olympia",
"state": "WA"
}
]
更新: 我能够通过试错法获得预期的结果,这些是我的发现:
[?state == 'WA'].[join('-',[name,state])][]
Output:
[
"Seattle-WA",
"Bellevue-WA",
"Olympia-WA"
]
此外,如果您提供的输入是 unicode 格式,我建议您添加to_json | from_json
如下所述的表达式:
selected_cities: "{{ test.locations| to_json | from_json | json_query(\"[?state == 'WA'].[join('-',[name,state])][]\") }}"
使用上面的表达式将在使用值或在任何条件下消除 unicode 错误。检查JMESPath站点以获取有关 json_query 的更多详细信息,这对解决问题非常有帮助。
解决方案
例如
- debug:
msg: "{{ locations|
json_query('[?state == `WA`].[name,state]')|
map('join', '-')|list }}"
给
msg:
- Seattle-WA
- Bellevue-WA
- Olympia-WA
相同的结果仅使用 Jinja2 过滤器给出了以下任务
- debug:
msg: "{{ _names|zip(_states)|map('join', '-')|list }}"
vars:
_locations: "{{ locations|selectattr('state', 'eq', 'WA')|list }}"
_names: "{{ _locations|map(attribute='name')|list }}"
_states: "{{ _locations|map(attribute='state')|list }}"
json_query 问题(在 2.10 及更高版本中修复)
有 JMESPath加入。很遗憾
- debug:
msg: "{{ locations|
json_query('[].join(`-`, [name,state])') }}"
失败
味精:|- json_query 过滤器插件中的 JMESPathError:在函数 join() 中,值的类型无效:西雅图,预期之一:['array-string'],收到:“AnsibleUnicode”
to_json|from_json 解决方法
引用json_query:为starts_with 添加示例并包含#72821
寄存器变量返回的数据结构需要使用 to_json 解析 | from_json 以获得正确的结果。修复:ansible-collections/community.general#320
- debug:
msg: "{{ locations|to_json|from_json|
json_query('[].join(`-`, [name,state])') }}"
给
msg:
- Seattle-WA
- New York-NY
- Bellevue-WA
- Olympia-WA
推荐阅读
- python - 如何处理来自 socketIO-client 中收到的数据包的数据?
- angular - 如何在应用内的 PWA 中显示通知?
- c# - 如何在拆分字符串中输出所有字符串数组?
- javascript - PWA iOS 令人讨厌的横向 20 像素间隙
- mysql - 将字符串映射到关系
- java - 从 Fragment 到 Activity 从 EditText 获取数据
- javascript - 在检索其内容之前执行页面脚本
- c++ - 检测 C++ 中异常处理的实现类型
- javascript - 为什么 console.log(fibonacci(3)); 打印未定义?
- javascript - 数据推送到数组后切换表中的行 | Vue