てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] デフォルトを gather_facts: false 扱いにする

はじめに

gather_facts のデフォルトは true です。つまり、各種システム情報はデフォルトで収集されます。

実際のところは、お決まりのように gather_facts: false を指定して無効にするケースのほうが多いのではないでしょうか。

デフォルトの挙動は DEFAULT_GATHERING という設定項目で変更できます。

デフォルトを無効にして挙動を試してみます。

パターン1: gathering=explicit、gather_facts 指定なし

ansible.cfg に以下の設定を追加します。

[defaults]
gathering=explicit

gathering が、設定項目 DEFAULT_GATHERINGansible.cfg で指定するときのキー名です。環境変数の場合は ANSIBLE_GATHERING

デフォルトは implicit で、gather_facts: false しない限り暗黙的に収集します。 上記で指定した explicitimplicit の逆です。gather_facts: true しない限り収集しません。

Playbook は以下。gather_facts は指定しませんが、先の設定により収集しない動作を期待します。

---
- hosts: rt01

  tasks:
    - name:
      debug:
        msg: hello

実行。ファクトの収集はされず、GATHERING_FACTS もログに表示されません。ok=1 です。

$ ansible-playbook -i ../inventory.ini collections.yml

PLAY [rt01] *****************************************************************************************

TASK [debug] ****************************************************************************************
ok: [rt01] => {
    "msg": "hello"
}

PLAY RECAP ******************************************************************************************
rt01      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

パターン2: gathering=explicitgather_facts: true

ansible.cfg

[defaults]
gathering=explicit

のままにして、Playbook 側で gather_facts: true を指定します。

---
- hosts: rt01
  gather_facts: true    # 明示的に true 指定

  tasks:
    - name:
      debug:
        msg: hello

実行。ファクト収集がされ、Gathering Facts がログに表示されました。ok=2 です。

$ ansible-playbook -i ../inventory.ini collections.yml

PLAY [rt01] ***************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************

TASK [debug] **************************************************************************************************
ok: [rt01] => {
    "msg": "hello"
}

PLAY RECAP ****************************************************************************************************
rt01          : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

おわりに

都度都度 gather_facts: false を指定するのがつらいときはデフォルトを変更してしまうのも手かもしれません。ただ、初見だと不思議におもられる可能性があるため少し注意です。

docs.ansible.com