You need to enable JavaScript to run this app. 如何使用Ansible与Jinja2生成包含所有主机信息的单个HTML报告
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Ansible与Jinja2生成包含所有主机信息的单个HTML报告

问题根源
  • 你的模板渲染任务加了run_once: true,渲染时默认只会取当前执行上下文(也就是第一个主机host-1)的变量,所以只会输出host-1的信息
  • 原模板还存在2处语法错误:多余的{% endfor %}标签、<tr>闭合标签位置错误,会导致HTML结构异常
解决方案

步骤1:保持Playbook配置不变

现有Playbook不需要修改,只要确保生成报告的任务是在所有主机的output数据采集任务之后执行即可:

- name: create HTML report
  template:
    src: report.j2
    dest: /cktreport.html
  delegate_to: localhost
  run_once: true

步骤2:修改report.j2模板

替换为如下内容,核心逻辑是先遍历本次play的所有主机,再逐个取每个主机的采集数据:

<!DOCTYPE html>
<html>
<body>
<table border="1"> <!-- 加border方便查看表格结构,不需要可删除 -->
    <thead>
        <tr>
            <th>HOSTNAME</th>
            <th>PORT</th>
            <th>CKTID</th>
        </tr>
    </thead>
    <tbody>      
    <!-- 先遍历所有参与本次play的主机 -->
    {% for host in ansible_play_hosts_all %}
        <!-- 取当前遍历主机的output.parsed数据 -->
        {% for item in hostvars[host].output.parsed %}
            {% if 'CID' in item.DESCRIP or 'ckid' in item.DESCRIP %}
            <tr>
                <td>{{ host }}</td>
                <td>{{ item.PORT }}</td>
                <td>{{ item.DESCRIP }}</td>
            </tr>
            {% endif %}    
        {% endfor %}
    {% endfor %}
    </tbody>
</table>
</body>
</html>

补充提示

如果执行后发现表格数据为空,可检查你采集的output变量名是否正确,若你采集的结果直接存在debug输出的msg变量中,将hostvars[host].output.parsed替换为hostvars[host].msg即可。

内容的提问来源于stack exchange,提问作者netv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 15:45:01