主要问题是,当剧本开始循环时,它只显示最后一个循环 api“Lun_name”结果,并且不显示之前循环的结果。
这将获取数组的名称和变量并通过剧本。
- 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 名称。
请注意,如果没有适当的最小可重现示例进行测试,下面的内容可能会出现与您的确切数据结构不匹配的轻微错误,可能不会导致确切的所需结果,并且可能会产生您必须纠正的错误在您的环境中修复
全局问题是您没有在正确的级别循环,并且您错误地使用了
set_fact
(在这种特定情况下实际上是不需要的)。
要理解下面的内容,您可能想要阅读(至少)用循环注册变量
以下是一种可能的解决方案,可以对其进行调整以更好地满足您的要求。
api.yml
文件,仅包含一次。将名称列表作为 var 传递到包含的文件
- 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>