Saída de tarefa Ansible para um arquivo no servidor ansible

Saída de tarefa Ansible para um arquivo no servidor ansible

Estou escrevendo um manual que verificará a versão do aplicativo em diferentes hosts e gravará a saída em uma variável Ansible.

Meu requisito é que eu queira gerar a variável ansible em um arquivo output.logPedaço de código ansible para escrever a variável ansible em output.log.

Qual é o problema é que a variável é gravada no arquivo apenas para o último host no inventário de hosts, mas quero que todos os hosts sejam anexados ao arquivo output.log

Referência da imagem

Responder1

Delegue a tarefa ao localhost e uselineinfilepara adicioná-lo ao seu arquivo:

- name: store info
  lineinfile: 
    path: "/tmp/out.log"
    regexp: "\\s{{ inventory_hostname }}$"
    line: "{{ java_version.msg }} {{ inventory_hostname }}"
    create: yes
  delegate_to: localhost

O regexpatributo garantirá que as entradas antigas sejam substituídas quando você executar o manual novamente e a versão for alterada.

Responder2

Instale um script de fatos /etc/ansible/facts.d/java.factem hosts remotos e torne-o executável. Escapar do JSON para imprimir na saída padrão é um pouco feio. Também é feio analisar um "número" de versão do arquivo java -version. Embora você possa coletar a versão de uma maneira diferente, ajuste o script conforme necessário.

#!/bin/sh
JAVA_VERSION=$(java -version 2>&1  | grep version | cut -d '"' -f 2)
printf "{\"java_version\": \"${JAVA_VERSION}\"}\n"

Escreva um modelo Jinja para imprimir as linhas do número da versão no formato desejado. Digamos que o arquivo sejatemplates/javaversionreport.txt

  • groups é um ditado mágico de inventário_hostname indexado por grupo
  • hostvars é um ditado mágico com variáveis ​​de outros hosts
  • ansible_local é a variável "fatos locais"
  • java vem do java.factnome do arquivo
{% for host in groups['hosts'] %}
{{ hostvars[host].ansible_local.java.java_version }} {{ host }}
{% endfor %}

E brinca de coletar fatos e redigir o relatório. Ajuste o padrão de hosts conforme desejado.

---
- 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

A renderização de um modelo é executada mais rapidamente do que reescrever arquivos com linefinfile. Embora a coleta de fatos possa ser lenta. Além disso, os modelos Jinja podem ser escritos em qualquer formato que você desejar.

informação relacionada