カスタムファクトの作成と使用

AnsibleBeginner
オンラインで実践に進む

はじめに

カスタムファクトを使用すると、管理対象ホストから Ansible にローカルデータを公開できます。/etc/ansible/facts.d 配下に配置されたファクトは、ファクト収集(fact gathering)後に ansible_local を通じて利用可能になります。

この実験では、小さなカスタムファクトファイルをインストールし、2 番目のプレイでそれを使用してレポートを作成します。

カスタムファクトプロジェクトの作成

このステップでは、カスタムファクトをインストールして読み取るためのプロジェクトを作成します。

cd /home/labex/project
mkdir -p rhce-ansible/{inventory,files,playbooks,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[managed]
host ansible_connection=local
EOF

カスタムファクトは管理対象ホストにインストールされるため、この実験ではプロジェクト内のソースファイルと、それを /etc/ansible/facts.d にコピーする Playbook の両方が必要です。

ローカルファクトソースファイルの作成

このステップでは、INI 形式のファクトファイルを作成します。セクション名とキーは ansible_local.rhce_custom.general の下に表示されます。 このステップでコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。これにより、LabEx が各ステップを個別に実行する場合でもコマンドが安定します。

cd /home/labex/project/rhce-ansible
cat > files/rhce_custom.fact <<'EOF'
[general]
course=rhce-ansible
track=custom-facts
EOF

このファイルは INI 形式の構文を使用しています。ファクト収集後、セクション名 general とそのキーは ansible_local.rhce_custom.general で利用可能になります。

cat files/rhce_custom.fact

ファクトをインストールして読み取る Playbook の作成

このステップでは、2 つのプレイで構成される Playbook を作成します。最初のプレイで特権昇格を使用してファクトファイルをインストールし、2 番目のプレイで再度ファクトを収集することで、ansible_local に新しいデータが含まれるようにします。 このステップでコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。

cd /home/labex/project/rhce-ansible
cat > playbooks/custom-fact.yml <<'EOF'
---
- name: Install custom fact
  hosts: managed
  become: true
  gather_facts: false
  tasks:
    - name: Ensure facts directory exists
      ansible.builtin.file:
        path: /etc/ansible/facts.d
        state: directory
        mode: '0755'

    - name: Install RHCE custom fact
      ansible.builtin.copy:
        src: ../files/rhce_custom.fact
        dest: /etc/ansible/facts.d/rhce_custom.fact
        mode: '0644'

- name: Read custom fact after gathering facts
  hosts: managed
  gather_facts: true
  tasks:
    - name: Write custom fact report
      ansible.builtin.copy:
        dest: /home/labex/project/rhce-ansible/reports/custom-fact.txt
        content: |
          course={{ ansible_local.rhce_custom.general.course }}
          track={{ ansible_local.rhce_custom.general.track }}
        mode: '0644'
EOF

/etc/ansible/facts.d はシステムパスであるため、最初のプレイでは become を使用してファクトファイルをインストールします。2 番目のプレイでは再度ファクトを収集します。この再収集を行わないと、同じ実行内で ansible_local に新しくインストールされたファクトが含まれません。

ansible-playbook playbooks/custom-fact.yml --syntax-check

カスタムファクト Playbook の実行

このステップでは、カスタムファクトをインストールし、ansible_local からレポートを作成します。最初のプレイでシステムファクトストレージを変更し、2 番目のプレイで Ansible がそれを読み取れることを確認します。 このステップでコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/custom-fact.yml | tee reports/custom-fact-run.txt

最初の実行で、ファクトファイルのインストールとレポートの作成が行われ、システムが変更されるはずです。保存された出力は、2 番目のプレイで ansible_local が見つからない場合に役立ちます。

cat reports/custom-fact.txt

レポートにはローカルファクトファイルからの course と track の値が含まれているはずであり、Ansible がカスタムファクトを収集して使用できたことが証明されます。

ansible_local の直接確認

このステップでは、setup モジュールにフィルターを適用して、カスタムファクトツリーを直接表示します。 このステップでコマンドを実行する前に、Ansible プロジェクトディレクトリに戻ってください。

cd /home/labex/project/rhce-ansible
ansible managed -m ansible.builtin.setup -a 'filter=ansible_local' | tee reports/ansible-local.txt

setup モジュールの出力は生のファクトツリーです。ansible_local にフィルタリングすることで、ローカルで提供されたカスタムファクトに焦点を当てた出力を得ることができます。

grep -E 'rhce_custom|custom-facts|rhce-ansible' reports/ansible-local.txt

grep の出力には、カスタムファクト名と書き込んだ値が表示されるはずです。これは、Playbook で ansible_local が認識されない場合に確認するための直接的な調査方法です。

まとめ

ホストローカルなカスタムファクトをインストールし、ファクトを再収集し、Playbook で ansible_local を使用し、setup モジュールを通じてカスタムファクトを調査しました。