答え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
リモート ホストに facts スクリプトをインストールし /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は
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
1 つのテンプレート レンダリングは、linefinfile を使用してファイルを書き換えるよりも高速に実行されます。ただし、ファクトの収集は遅くなる可能性があります。また、Jinja テンプレートは任意の形式で記述できます。