我可以在ansible的jinja2模板中运行shell命令吗

我可以在ansible的jinja2模板中运行shell命令吗,ansible,jinja2,Ansible,Jinja2,这是一个与我的资源清册文件中的所有服务器连接的剧本,记录了装载点使用率超过80%的主机的服务器ip和装载点信息,并写入本地主机(ansible controller)上的文本文件 我想知道是否可以创建一个jinja2模板,并将剧本简化为一项任务。我被困在jinja2模板中集成shell命令,我不确定这是否可行。请告知 - hosts: all tasks: - template: src: monitor.txt.j2 dest: /home/app

这是一个与我的资源清册文件中的所有服务器连接的剧本,记录了装载点使用率超过80%的主机的服务器ip和装载点信息,并写入本地主机(ansible controller)上的文本文件

我想知道是否可以创建一个jinja2模板,并将剧本简化为一项任务。我被困在jinja2模板中集成shell命令,我不确定这是否可行。请告知

- hosts:  all
  tasks:
    - template:
        src: monitor.txt.j2
        dest: /home/app/playbooks/monitor.txt
      delegate_to: localhost
monitor.txt.j2

{% for host in groups['all'] %}
{{ hostvars[host].ansible_host }}
--shell command--
{% endfor %}

正如我在您的问题下的评论中所说,虽然可以使用
shell
command
模块,但Ansible是一种配置/自动化工具,因此最好忘记使用本机Ansible功能的shell编码/逻辑,这样可以简化任务/剧本编写

例如,无需执行
df
,因为ansible在连接时将收集有关目标的信息,包括设备及其容量和当前使用情况,因此您可以直接使用这些信息

对于jinja问题,您可以使用模块并直接传递此模块上选项中的jinja代码:

-name:触发主机上的任务以收集事实
主持人:全部
任务:
-副本:
dest:/home/app/playbooks/monitor.txt
内容:|
{%用于组['all']%中的主机}
{hostvars[host].ansible_mounts%}
{%if(dev.block_used/dev.block_total*100)>80%}{{dev.block_used/dev.block_total*100}{{{dev.mount}{%endif%}
{%endfor%}
{%endfor%}
跑一次:对
委托给:localhost

首先一些建议:在ansible中,忘记你的shell习惯,不要使用df为设备获取空间,而是使用包含所有设备及其磁盘使用情况的ansible\u事实,也不要使用echo生成文件。感谢你指出正确的方法。我继承了上面的方法,用一些自定义更改更新了我的脚本。该反馈还表明,在ansible中的jinja2模板中不可能使用shell命令。
{% for host in groups['all'] %}
{{ hostvars[host].ansible_host }}
--shell command--
{% endfor %}