Jinja2 在设置变量时应用 regex_replace 并对 json 文件执行查找

问题描述 投票:0回答:1

我有一个包含节点 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 ansible jinja2 lookup
1个回答
0
投票

具有有效的 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

感谢

© www.soinside.com 2019 - 2024. All rights reserved.