Ansible 서버의 파일로 Ansible 작업 출력

Ansible 서버의 파일로 Ansible 작업 출력

저는 다양한 호스트에서 애플리케이션 버전을 확인하고 출력을 Ansible 변수에 쓰는 플레이북을 작성 중입니다.

내 요구 사항은 ansible 변수를 output.log 파일로 출력하고 싶다는 것입니다.ansible 변수를 output.log에 쓰는 ansible 코드 조각.

문제는 변수가 호스트 인벤토리의 마지막 호스트에 대해서만 파일에 기록된다는 것입니다. 하지만 모든 호스트가 output.log 파일에 추가되기를 원합니다.

이미지 참조

답변1

localhost에 작업을 위임하고 사용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의 마법 사전입니다.
  • Hostvars는 다른 호스트의 변수를 포함하는 마법의 사전입니다.
  • ansible_local은 "로컬 사실" 변수입니다.
  • java.factjava는 파일 이름 에서 따온 것입니다.
{% 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 템플릿은 원하는 형식으로 작성할 수 있습니다.

관련 정보