以下の内容はhttps://tekunabe.hatenablog.jp/entry/2026/01/13/deprecated_inject_facts_as_varsより取得しました。


[Ansible] ansible_date_time のようなトップレベルのファクト変数が非推奨になった (ansible-core 2.20.0 から)

はじめに

Ansible には、OSのバージョンやIPアドレスなどのシステム情報を収集する仕組みがあります。これらのシステム情報をファクト(fact / fatcs)と呼びます。

ファクトは、ansible_ というプレフィックスを持つ変数や、変数 ansible_facts の中に入る値として参照できます。たとえば時刻であれば、ansible_date_time というトップレベルの変数か、ansible_facts['date_time'] といった具合です。

もともとトップレベルの変数の仕様があって、どこかの Ansible のバージョンから ansible_facts['hoge'] でも参照できるようになったという経緯があります。

2025年11月にリリースされた ansible-core 2.20.0 では、トップレベルの変数としてのファクト(ansible_date_time など)の参照が非推奨(Deprecated)になりました。

  • ansible-core 2.20.0 の Changelog より引用
    • INJECT_FACTS_AS_VARS configuration currently defaults to True, this is now deprecated and it will switch to False by Ansible 2.24.

参照すると警告が表示されます。ansible-core 2.24 ではいよいよ利用できなくなる(変数未定義扱い)になる予定です。

実際、どのような警告が表示されるのか試してみたので、結果をまとめます。

  • 検証環境
    • ansible-core 2.20.0

検証 Playbook

以下のような Playbook を利用します。

ファクトを収集する必要があるので、gather_facts: false は指定しません。

---
- name: Facts test Play
  hosts: localhost
  connection: local

  tasks:
    - name: Facts test
      ansible.builtin.debug:
        msg: "{{ ansible_date_time }}"  # トップレベルの変数を参照

実行結果

実行結果は以下のとおりです。

ansible_date_time を参照している箇所が示され、プレフィックス ansible_ (トップレベル)ではなく、ansible_facts["fact_name"] を使ってねという警告が表示されました。エラーではなく警告なので、Playbook の処理自体は続行されました。

$ ansible-playbook -i localhost, facts_test.yml

PLAY [Facts test Play] ********************************************************************************************

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

ok: [localhost]

TASK [Facts test] *************************************************************************************************
[WARNING]: Deprecation warnings can be disabled by setting `deprecation_warnings=False` in ansible.cfg.
[DEPRECATION WARNING]: INJECT_FACTS_AS_VARS default to `True` is deprecated, top-level facts will not be auto injected after the change. This feature will be removed from ansible-core version 2.24.
Origin: /home/sakana/ansible/ac220/facts_test.yml:10:14

 8     - name: Facts test
 9       ansible.builtin.debug:
10         msg: "{{ ansible_date_time }}"
                ^ column 14

Use `ansible_facts["fact_name"]` (no `ansible_` prefix) instead.

ok: [localhost] => {
    "msg": {
        "date": "2025-12-05",
        "day": "05",
        "epoch": "1764916154",
        "epoch_int": "1764916154",
        "hour": "15",
        "iso8601": "2025-12-05T06:29:14Z",
        "iso8601_basic": "20251205T152914982733",
        "iso8601_basic_short": "20251205T152914",
        "iso8601_micro": "2025-12-05T06:29:14.982733Z",
        "minute": "29",
        "month": "12",
        "second": "14",
        "time": "15:29:14",
        "tz": "JST",
        "tz_dst": "JST",
        "tz_offset": "+0900",
        "weekday": "Friday",
        "weekday_number": "5",
        "weeknumber": "48",
        "year": "2025"
    }
}

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

もちろん、ansible_facts['date_time'] を参照する場合は、警告なしで実行できます。

設定による制御

トップレベルの変数としてのファクトが参照できるのは、INJECT_FACTS_AS_VARSという設定が、現状(ansible-core 2.20.0現在)はデフォルトで True であるためです。

$ ansible-config dump | grep -i inject
INJECT_FACTS_AS_VARS(default) = True

この設定を False にすることで、トップレベルの変数としてのファクトが参照できなくなります。ansible-core 2.24 への備えにもなるかもしれません。

[defaults]
inject_facts_as_vars=False

ansible.cfg で設定する場合は、上記のような定義をしておき Playbook を実行すると、以下のような結果になります。

例の警告は表示されず、いきなり ansible_date_time という変数は未定義ですというエラーです。エラーなので処理も止まります。

$ ansible-playbook -i localhost, facts_test.yml

PLAY [Facts test Play] *****************************************************************************************

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

ok: [localhost]

TASK [Facts test] **********************************************************************************************
[ERROR]: Task failed: Finalization of task args for 'ansible.builtin.debug' failed: Error while resolving value for 'msg': 'ansible_date_time' is undefined

Task failed.
Origin: /home/sakana/ansible/ac220/facts_test.yml:8:7

6
7   tasks:
8     - name: Facts test
        ^ column 7

<<< caused by >>>

Finalization of task args for 'ansible.builtin.debug' failed.
Origin: /home/yokochi/git/general/ansible/ac220/facts_test.yml:9:7

7   tasks:
8     - name: Facts test
9       ansible.builtin.debug:
        ^ column 7

<<< caused by >>>

Error while resolving value for 'msg': 'ansible_date_time' is undefined
Origin: /home/yokochi/git/general/ansible/ac220/facts_test.yml:10:14

 8     - name: Facts test
 9       ansible.builtin.debug:
10         msg: "{{ ansible_date_time }}"
                ^ column 14

fatal: [localhost]: FAILED! => {"msg": "Task failed: Finalization of task args for 'ansible.builtin.debug' failed: Error while resolving value for 'msg': 'ansible_date_time' is undefined"}

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

おわりに

まだ警告レベルなので修正の緊急度は高くないですが、少なくとも今後書く際は ansible_facts["fact_name"] の形式がよいと思います。

ま余談ですが、こんなこともあろうかと(?)、「Ansible実践ガイド 第3版」から「Ansible 実践ガイド 第4版 [基礎編]」に改版するときに、ansible_facts['hogehoge'] の形式に書き換えています。

参考




以上の内容はhttps://tekunabe.hatenablog.jp/entry/2026/01/13/deprecated_inject_facts_as_varsより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14