答案1
将任务委托给本地主机并使用lineinfile
将其添加到您的文件中:
- name: store info
lineinfile:
path: "/tmp/out.log"
regexp: "\\s{{ inventory_hostname }}$"
line: "{{ java_version.msg }} {{ inventory_hostname }}"
create: yes
delegate_to: localhost
该regexp
属性将确保当您再次运行剧本并且版本发生更改时,旧条目会被替换。
答案2
在远程主机上安装一个事实脚本 /etc/ansible/facts.d/java.fact
并使其可执行。转义 JSON 以在标准输出上打印有点丑陋。从中解析版本“编号”也很难看java -version
。尽管您可能以不同的方式收集版本,但请根据需要调整脚本。
#!/bin/sh
JAVA_VERSION=$(java -version 2>&1 | grep version | cut -d '"' -f 2)
printf "{\"java_version\": \"${JAVA_VERSION}\"}\n"
编写一个 Jinja 模板,以所需格式打印版本号行。假设文件是templates/javaversionreport.txt
- groups 是 inventory_hostname 的一个神奇字典,由 group 索引
- hostvars 是一个包含其他主机变量的魔法字典
- ansible_local 是“本地事实”变量
- java 来自
java.fact
文件名
{% for host in groups['hosts'] %}
{{ hostvars[host].ansible_local.java.java_version }} {{ host }}
{% endfor %}
并负责收集事实和撰写报告。根据需要调整主持人模式。
---
- hosts: hosts
gather_facts: True
fact_path: /etc/ansible/facts.d
- hosts: localhost
gather_facts: False
tasks:
- template:
src: javaversionreport.txt
dest: /tmp/out.log
一个模板渲染比使用 linefinfile 重写文件运行得更快。尽管事实收集可能很慢。此外,Jinja 模板可以以您喜欢的任何格式编写。