我有一个包含节点 ID 和其他数据的 json 文件,以及另一个包含节点 ID 和节点名称的文件。要求是从较长的字符串中提取节点 ID,然后在其他 json 文件中查找节点名称。
psuoutput.json
"result": [
{
"env": {
"data": {
"id": "chassis-5/node-8/psu/psuA",
"status": "ok",
}
}
},
chassisinv.json
"result": [
{
"chassis": {
"data": {
"id": "8",
"name": "ecuserver",
}
}
},
我可以提取节点 ID 并了解检索节点名称所需的 json_query,但是,我无法使一切正常工作。
- name: Load inv
set_fact:
chassisinv: "{{ lookup('file', 'chassisinv.json') }}"
- name: Extract data
vars:
input: "{{ lookup('file',psuoutput.json) | from_json }}"
set_fact:
csv_content: |
{% for server in input.result %}
{% set nodeid = server.env.data.id | regex_replace('.*node-([^\/]*).*', '\1') %}
{% set nodename = {{ chassisinv | from_json | json_query(".result[] | select (.chassis.data.id=="{{ nodeid }}").chassis.data.name") }}
{{ nodeid }},{{ nodename }},{{ server.env.data.status }}
{% endfor %}
delegate_to: localhost
Jinja2 在设置 nodeid 时似乎没有应用 regex_replace,因此 {{ nodeid }} 会导致空变量和 json_query 错误,因为它无法使用空查找数据运行。
我也不确定这是解码数据(名称)的最佳方式,将正则表达式操作的 json 字段(id)作为输入,在另一个 json 文件中查找它。
请问您能帮忙吗?
具有有效的 JSON 结构的最小示例手册
- hosts: localhost
become: false
gather_facts: false
vars:
input:
result: [
{
"env": {
"data": {
"id": "chassis-5/node-8/psu/psuA",
"status": "ok",
}
}
}
]
chassisinv:
result: [
{
"chassis": {
"data": {
"id": "8",
"name": "eight",
}
}
}
]
tasks:
- debug:
msg: |
{% for i in input.result %}
{% set nodeid = (i.env.data.id | split('/') )[1] | split('-') | last %}
{% set nodename = (chassisinv.result | selectattr("chassis.data.id", 'match', nodeid) | first ).chassis.data.name %}
{{ nodeid }}, {{ nodename }}, {{ i.env.data.status }}
{% endfor %}
将产生
的输出TASK [debug] *****
ok: [localhost] =>
msg: |-
8, eight, ok
感谢