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属性将确保当您再次运行剧本并且版本发生更改时,旧条目会被替换。

答案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 模板可以以您喜欢的任何格式编写。

相关内容