答案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
屬性將確保當您再次執行 playbook 並且版本已變更時舊條目會被取代。
答案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 的魔法字典
- 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 模板可以編寫為您喜歡的任何格式。