■ はじめに
Ansible では、ホスト名やインターフェースなどのシステムの基本情報を fatcs (ファクト)という単位で収集して管理します。通常、Ansible によって決められた情報が対象になりますが、任意の情報を facts として管理するための local facts (custom facts) という機能もあります。
この記事では、簡単な例を元にして、local facts の定義の方法と確認する方法を説明します。
動作確認環境
- Ansible 2.3.0, 2.7.8
- CentOS 7.6 (Ansible 側、管理対象ホスト側とも)
■ local facts の特徴
local とは?
local というのは Ansible 自身を実行するコントロールホストにとっての local ではなく、管理対象のリモートホストにとっての local です。
定義方法
- リモートホストの
/etc/ansible/facts.d/
ディレクトリ配下に配置する - フォーマットは ini か json
- いずれの場合も拡張子は
.fact
にする
- いずれの場合も拡張子は
- ini の場合、セクション(例:
[hogehoge]
)が必須 - json を返す実行可能なファイルも可
- yaml は不可
名前空間
- local facts は
ansible_local
配下の名前空間- Ansible 2.5 以降では
ansible_facts.ansible_local
でも参照可
- Ansible 2.5 以降では
- さらに下に以下のように続く
- ini の場合、
ファイル名.セクション名.キー
- json の場合、
ファイル名.キー
- ini の場合、
■ 動作確認
準備1: リモートホスト上の local facts 定義ファイル
試しに2つの形式で準備しておきます。
json 版
/etc/ansible/facts.d/test_j.fact
{ "kind": ["wakin", "demekin", "ryukin"] }
ini 版
/etc/ansible/facts.d/test_i.fact
[section1] custom_name=kingyo custom_group=fish
準備2: Playbook
facts を収集して ansible_local
配下の facts を debug
モジュールで表示する Playbook です。
- hosts: linux gather_facts: yes # default tasks: - name: debug: msg: "{{ ansible_local }}"
実行ログ
それでは実行します。
$ ansible-playbook -i inventory custom_facts.yml PLAY [linux] *********************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************* ok: [linux1] TASK [debug] *********************************************************************************************************** ok: [linux1] => { "msg": { "test_i": { "section1": { "custom_group": "fish", "custom_name": "kingyo" } }, "test_j": { "kind": [ "wakin", "demekin", "ryukin" ] } } } PLAY RECAP ************************************************************************************************************* linux1 : ok=2 changed=0 unreachable=0 failed=0
無事に /etc/ansible/facts.d/test_i.fact
と /etc/ansible/facts.d/test_j.fact
の2つの local facts の内容が確認できました。ファイル名や、ini の場合はセクション名も名前空間に含まれていることが確認できます。
なお、ini 形式にセクションがない場合は、"test_i": "error loading fact - please check content",
のようなメッセージが表示され、正常に local facts が読み込めません。
■ まとめ
local facts の特徴や定義方法を説明しました。任意の情報を facts として扱いたい場合は、この方法を参考にしていただければと思います。