如何使电子邮件模板显示不同的变量结果,并用循环分隔?

How can I make the email template show different variables results separated by loops?

提问人:sevenstreak 提问时间:8/14/2023 最后编辑:Zeitounatorsevenstreak 更新时间:8/16/2023 访问量:30

问:

主要问题是,当 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>

它在电子邮件中显示了这个结果:

enter image description here

我希望它显示每个阵列的不同 lun 名称,但只显示最后一个阵列 lun 名称。

循环 模板 变量 ansible jinja2

评论


答:

2赞 Zeitounator 8/14/2023 #1

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


全局问题是你没有在正确的级别循环,并且你错误地使用了(在这种特定情况下实际上是不需要的)。set_fact

要理解以下内容,您可能希望阅读(至少)使用循环注册变量

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

  1. 不要遍历你的文件,只包含一次。将名称列表作为 var 传递到包含的文件api.yml
    - 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>
    

评论

0赞 sevenstreak 8/15/2023
谢谢,我现在明白了我是如何在一开始就犯错的。它现在正在获得预期的结果。非常感谢。