답변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.fact
java는 파일 이름 에서 따온 것입니다.
{% 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 템플릿은 원하는 형식으로 작성할 수 있습니다.