てくなべ (tekunabe)

ansible / network / automation / StackStorm

[Ansible] 任意のfactsを定義できる local facts (custom facts) の定義方法

■ はじめに

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 は不可

名前空間


■ 動作確認

準備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 として扱いたい場合は、この方法を参考にしていただければと思います。

参考

docs.ansible.com