这是一本剧本,可与清单文件中的所有服务器连接,并记下安装点使用率超过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 %}
答案 0 :(得分:1)
正如我在对您的问题的评论中所说,虽然可以使用shell
或command
模块,但是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