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

リモート ホストに 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 テンプレートは任意の形式で記述できます。

関連情報