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.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
Responder1
Delegue a tarefa ao localhost e uselineinfile
para 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 regexp
atributo 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.fact
em 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.fact
nome 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.