如何使用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
相关产品推荐
相关产品推荐

