Ansible 任務輸出到 ansible 伺服器中的文件

Ansible 任務輸出到 ansible 伺服器中的文件

我正在編寫一個劇本,它將檢查不同主機上的應用程式版本並將輸出寫入 Ansible 變數。

我的要求是我想將ansible變數輸出到檔案output.log將 ansible 變數寫入 output.log 的一段 ansible 程式碼

問題是變數僅寫入主機清單中最後一個主機的文件,但我希望將所有主機附加到output.log文件中

圖片參考

答案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 模板可以編寫為您喜歡的任何格式。

相關內容