You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Jinja2正则提取节点ID并关联JSON查询节点名失败求助

解决Ansible中regex_replace失效及节点名匹配优化问题

1. 修复regex_replace提取节点ID的问题

先确认正则表达式是否匹配长ID的格式。比如如果长ID格式是/redfish/v1/Chassis/[节点ID]/...,正确的regex_replace写法如下:

- name: 提取节点ID
  set_fact:
    nodeid: "{{ item.id | regex_replace('^.*Chassis/([^/]+)/.*$', '\\1') }}"
  loop: "{{ lookup('file', 'psuoutput.json') | from_json }}"

注意事项:

  • 正则表达式要精准匹配长ID结构,[^/]+用于匹配不含斜杠的节点ID部分
  • Jinja2单引号环境下反向引用用\\1,双引号环境下需转义为\\\\1
  • 确保item.id是psuoutput.json中存储长ID的正确字段名

若regex_replace仍返回空值,先打印长ID值确认格式:

- name: 打印长ID原始值
  debug:
    msg: "{{ item.id }}"
  loop: "{{ lookup('file', 'psuoutput.json') | from_json }}"

2. 优化节点名匹配逻辑

避免循环调用json_query,建议先将chassisinv.json转为字典,通过节点ID直接取值,效率更高:

- name: 加载机箱清单并转为字典
  set_fact:
    chassis_dict: "{{ lookup('file', 'chassisinv.json') | from_json | items2dict(key_name='node_id', value_name='node_name') }}"

- name: 匹配节点名并整合数据
  set_fact:
    psu_with_node_name: "{{ psu_with_node_name | default([]) + [item | combine({'node_name': chassis_dict.get(nodeid, 'Unknown')})] }}"
  loop: "{{ lookup('file', 'psuoutput.json') | from_json }}"
  vars:
    nodeid: "{{ item.id | regex_replace('^.*Chassis/([^/]+)/.*$', '\\1') }}"

3. 完整示例任务

- name: 处理PSU数据与节点名匹配
  hosts: localhost
  gather_facts: no
  tasks:
    - name: 加载机箱清单并转为字典
      set_fact:
        chassis_dict: "{{ lookup('file', 'chassisinv.json') | from_json | items2dict(key_name='node_id', value_name='node_name') }}"

    - name: 处理PSU数据,匹配节点名
      set_fact:
        psu_final_data: "{{ psu_final_data | default([]) + [
            item | combine({
                'node_id': item.id | regex_replace('^.*Chassis/([^/]+)/.*$', '\\1'),
                'node_name': chassis_dict.get(item.id | regex_replace('^.*Chassis/([^/]+)/.*$', '\\1'), 'Unknown')
            })
        ] }}"
      loop: "{{ lookup('file', 'psuoutput.json') | from_json }}"

    - name: 输出最终结果
      debug:
        var: psu_final_data

常见问题排查

  • nodeid为空:检查正则表达式是否完全匹配长ID格式,注意大小写、额外字符或斜杠差异
  • 节点名显示Unknown:确认chassisinv.json中node_id字段值与提取的nodeid完全一致(无大小写、空格差异)
  • 效率优化:使用items2dict将清单转成字典后,查询时间复杂度从O(n)降至O(1),数据量大时优势明显

内容的提问来源于stack exchange,提问作者everlearning777

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 16:12:39