gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:26:45 34 4
gpt4 key购买 nike

这是一个与我的 list 文件中的所有服务器连接的剧本,并记下挂载点使用率超过 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 模板并将剧本归结为一项任务。我坚持在 jinja2 模板中集成一个 shell 命令,我不确定这是否可能。请指教。

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

监控.txt.j2

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

最佳答案

正如我在您的问题下的评论中所说,虽然可以使用 shellcommand 模块,但 Ansible 是一种配置/自动化工具,因此最好忘记您的 shell 编码/逻辑以使用 native 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

关于ansible - 我可以在 ansible 的 jinja2 模板中运行 shell 命令吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62728254/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com