如何让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
相关产品推荐
相关产品推荐

