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

时间:2020-07-04 10:56:41

标签: ansible jinja2

这是一本剧本,可与清单文件中的所有服务器连接,并记下安装点使用率超过80%的主机的服务器ip和安装点信息,并将其写入本地主机上的文本文件( ansible-controller)。

- hosts: all
  tasks:
    - shell:
         cmd: df -h | sed 's/%//g' | awk '$5 > 80 {if (NR > 1) print $5"%",$6}'
      register: disk_stat
    - debug:
         var: disk_stat

    - file:
         path: /home/app/space_report_{{ td }}.txt
         state: touch
      run_once: true
      delegate_to: localhost

    - shell: echo -e "{{ ansible_host }} '\n' {{ disk_stat.stdout_lines| to_nice_yaml }}" >> /home/thor/space_report_{{ td }}.txt
      args:
         executable: /bin/bash
      delegate_to: localhost

我想知道是否可以创建jinja2模板并将剧本简化为一项任务。我一直坚持将shell命令集成到jinja2模板中,但不确定是否可行。请告知。

- 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 %}

1 个答案:

答案 0 :(得分:1)

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

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

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

- name: Trigger a tasks on hosts to gather facts
  hosts: all
  tasks:
    
    - copy:
         dest: /home/app/playbooks/monitor.txt
         content: |
           {% for host in groups['all'] %}
           {% for dev in 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 %}
       run_once: true
       delegate_to: localhost