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

如何让Ansible邮件模板展示循环中各次的Lun_name结果?

问题分析与解决方案

问题根源:你在循环执行任务时,每次都用全局变量lun_name存储LUN名称,循环过程中这个变量会被不断覆盖,最终只保留最后一次循环的结果,导致邮件模板里所有数组都显示最后一次的LUN列表。


解决方案1:收集所有结果到列表(推荐)

修改逻辑,把每个数组的名称和对应的LUN列表关联起来,存储到一个全局列表中,避免变量覆盖。

步骤1:主Playbook初始化结果列表

在调用循环任务前,先初始化一个空列表用于存储所有结果:

- name: 初始化LUN结果存储列表
  set_fact:
    all_lun_results: []

步骤2:修改api.yml中的任务

替换原来的Lun Name任务,不再覆盖单个变量,而是把当前数组的信息追加到结果列表:

- name: access the Unity API
  uri:
    url: "https://{{ item.endpoint_host }}:443/api/types/lun/instances?"
    user: "{{ item.endpoint_user }}"
    password: "{{ item.endpoint_pass }}"
    body_format: json
    method: GET
    force_basic_auth: true
    validate_certs: false
    headers:
      Accept: application/json
      Content-Type: application/json
      X-EMC-REST-CLIENT: true
  register: api_result

- name: 存储当前数组的LUN结果
  set_fact:
    all_lun_results: "{{ all_lun_results + [
        {'array_name': item.name, 'lun_names': api_result | json_query('*.entries[].content.name')}
    ] }}"

步骤3:修改邮件模板

模板中循环all_lun_results列表,每个条目对应一个数组和它的LUN列表:

# 存储数组LUN报告

{% for entry in all_lun_results %}
## {{ entry.array_name }}
对应的LUN列表:
{% for lun in entry.lun_names %}
- {{ lun }}
{% endfor %}

{% endfor %}

解决方案2:利用循环任务的注册结果

如果不想修改api.yml,可以在主Playbook中注册循环任务的结果,再后续整理数据:

步骤1:主Playbook注册循环结果

- name: luns report
  include_tasks: api.yml
  loop: "{{ array_lookup_list | selectattr('name') }}"
  register: lun_task_results

步骤2:整理所有结果

- name: 整理LUN结果
  set_fact:
    all_lun_results: "{{ all_lun_results | default([]) + [
        {'array_name': item.item.name, 'lun_names': item.api_result | json_query('*.entries[].content.name')}
    ] }}"
  loop: "{{ lun_task_results.results }}"

步骤3:邮件模板同方案1

同样使用all_lun_results列表进行渲染即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:41:30