如何解决Ansible 如何从 shell 注册的输出构造数组,包括各自的主机名
我正在尝试从特定组的每个主机获取进程的状态,并以表格格式打印主机名和进程状态。
[nginx]
172.1.0.1
172.1.0.2
---
hosts: all
tasks:
- name: Get process status
shell: ps -ef| grep [n]ginx
register: nginx_status
when: '"nginx" in group_names'
期望的数组/表格格式如下(我在这里使用 shell 命令返回码来定义 UP 或 DOWN)。
例如:
jinja2 template to capture output:
{% for output in nginx_status.stdout_lines %}
{{ output.hostname }} {{ if output.rc == 0 UP else DOWN }}
{% endfor %}
模板不是强制性的,最终输出是我所期待的。
Final output:
HOST NGINX
172.1.0.1 UP
172.1.0.2 DOWN
最后,每个组的合并输出应该是这样的。
HOST NGINX Some-x Some-Y
172.1.0.1 UP DOWN UP
172.1.0.2 DOWN UP NA(Not Applicable)
解决方法
如果目标是将输出打印到控制台,则尝试过滤运行剧本的输出。有一些方法可以完全在 ansible 中做到这一点,但它更多地涉及使用 map
。
test.yml
:
---
- hosts: nginx
tasks:
- name: Get process status
command: pgrep nginx
register: proc_status
changed_when: false
failed_when: false
- debug:
msg: "###HOST NGINX###"
run_once: true
- debug:
msg: "###{{ ansible_host }} {{ (proc_status.rc == 0) | ternary('UP','DOWN') }}###"
运行:ansible-playbook test.yml | grep "###" | cut -d'#' -f4
应该导致类似:
HOST NGINX
192.168.15.101 UP
192.168.15.102 DOWN
您的用例可能因 ###
标记和表格列布局(使用 Linux column
命令?)而异,但这应该提供解决问题的基础知识。
请注意,您的原始 ps -ef | grep ...
不会从结果中过滤自身,因此始终会匹配。如果您沿 ps -ef | grep -v grep | grep [n]ginx
上的路线行驶,则需要使用 pgrep
之类的东西进行调整。
我回答是因为我没有足够的代表来评论。
“如果我使用 localhost 的委托附加在同一个文件中,那么 {{ ansible_host }} 将成为 localhost 而不是每个主机 IP。– SNR”
"{{inventory_hostname }}" 仍然是它在罐头上所说的,即使在 "delegate_to: localhost" 任务中也是如此。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。