提问人:sevenstreak 提问时间:8/14/2023 最后编辑:Zeitounatorsevenstreak 更新时间:8/16/2023 访问量:30
如何使电子邮件模板显示不同的变量结果,并用循环分隔?
How can I make the email template show different variables results separated by loops?
问:
主要问题是,当 playbook 开始循环时,它只显示最后一个循环 api“Lun_name”结果,而不会显示之前循环的结果。
这将获取数组的名称和变量,并传递 playbook。
- name: luns report
include_tasks: api.yml
loop: "{{ array_lookup_list | selectattr('name') }}"
然后,它遍历数组主机名并注册来自 api 的响应。
api.yml的
- 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 Name
set_fact:
lun_name: "{{ api_result | json_query(jmesquery) }}"
vars:
jmesquery: '*.entries[].content.name'
然后,它通过此模板发送到电子邮件。
模板
<body>
<div class="instructions">
List of unassigned LUNs from named arrays:
</div>
{% for name in array_lookup_list | selectattr('name') %}
<h3> </h3>
<table width="80%" class="dataframe">
<thead>
<tr>
<!-- shows the array name it came from -->
<th width="20%"> {{ name.name }} </th>
</tr>
</thead>
<tbody>
<tr>
<td>
<!-- shows the lun name -->
{{ lun_name }} </br>
</td>
</tr>
</tbody>
</table>
{% endfor %}
</body>
它在电子邮件中显示了这个结果:
我希望它显示每个阵列的不同 lun 名称,但只显示最后一个阵列 lun 名称。
答:
2赞
Zeitounator
8/14/2023
#1
请注意,如果没有适当的最小可重现示例进行测试,以下示例可能会出现与您的确切数据结构不匹配的轻微错误,可能不会产生确切的预期结果,并且可能会产生您必须在环境中修复的错误
全局问题是你没有在正确的级别循环,并且你错误地使用了(在这种特定情况下实际上是不需要的)。set_fact
要理解以下内容,您可能希望阅读(至少)使用循环注册变量
下面是一种可能的解决方案,可以进行调整以更好地满足您的要求。
- 不要遍历你的文件,只包含一次。将名称列表作为 var 传递到包含的文件
api.yml
- name: luns report include_tasks: api.yml vars: lookup_names: "{{ array_lookup_list | selectattr('name') }}"
- 修改包含的文件,如下所示:
api.yml
- 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: lun_lookup loop: "{{ lookup_names }}"
- 按如下方式修改电子邮件模板(截断为只需要更改行)
<body> <div class="instructions"> List of unassigned LUNs from named arrays: </div> {% for lun_info in lun_lookup.results %} {% set array_name = lun_info.item %} {% set lun_names = lun_info | json_query('*.entries[].content.name') %} <table width="80%" class="dataframe"> <thead> <tr> <!-- shows the array name it came from --> <th width="20%"> {{ array_name}} </th> </tr> </thead> <tbody> <tr> <td> <!-- shows the lun names as list dumped to a string --> {{ lun_names }} </br> </td> </tr> </tbody> </table> {% endfor %} </body>
评论
0赞
sevenstreak
8/15/2023
谢谢,我现在明白了我是如何在一开始就犯错的。它现在正在获得预期的结果。非常感谢。
评论