如何让电子邮件模板显示由循环分隔的不同变量结果?

问题描述 投票:0回答:1

主要问题是,当剧本开始循环时,它只显示最后一个循环 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 名称。

loops templates variables ansible jinja2
1个回答
0
投票

请注意,如果没有适当的最小可重现示例进行测试,下面的内容可能会出现与您的确切数据结构不匹配的轻微错误,可能不会导致确切的所需结果,并且可能会产生您必须纠正的错误在您的环境中修复


全局问题是您没有在正确的级别循环,并且您错误地使用了

set_fact
(在这种特定情况下实际上是不需要的)。

要理解下面的内容,您可能想要阅读(至少)用循环注册变量

以下是一种可能的解决方案,可以对其进行调整以更好地满足您的要求。

  1. 不要循环遍历您的
    api.yml
    文件,仅包含一次。将名称列表作为 var 传递到包含的文件
    - name: luns report
      include_tasks:  api.yml
      vars:
        lookup_names: "{{ array_lookup_list | selectattr('name') }}"
    
  2. 修改
    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 }}"
    
  3. 修改电子邮件模板如下(截断为只需要更改行)
    <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>
    
© www.soinside.com 2019 - 2024. All rights reserved.