以下の内容はhttps://endy-tech.hatenablog.jp/entry/fallible_register_projectionsより取得しました。


FallibleでRegister Projectionsを試してみた

本記事はAnsible Advent Calendar 2025 7日目の記事です。

お伝えしたいこと

Ansibleに今後リリースされるかもしれない、されないかもしれないRegister Projections機能をご紹介します。

(背景) 記事を書こうと思ったきっかけ

Ansible Forumのメーリングリストで面白そうな記事の情報が届きました。

Fallible 2025.12.5 released with Register Projections and new Action API previews

Fallibleってなんでしょうか? 何やらAnsibleと関係ありそうな名前です。

調べてみると、PyPIにFallibleの説明が簡潔に書いてありました。

fallible, an experimental ansible

PyPI - fallible 2025.12.5

Ansibleの実験的な機能リリースが提供されるパッケージのようです。 冒頭の記事は、そのFallibleで「Register Projections」と「new Action API」がプレビュー版として提供されたというお知らせでした。

今回の記事は、その「Register ProjectionをFallibleで試してみた」という主旨になります。

(本題) 試してみる

さっそく試してみましょう。 まずはFallibleをインストールします。

python3 -m venv venv
source venv/bin/activate
pip install fallible

続いてPlaybookを書きます。 Register Projections機能を使うには、「タスクの実行結果を格納する」という意味を持つregisterキーワードを特別な方法で指定します。

- name: Test
  hosts: localhost
  gather_facts: false
  tasks:
    - name: Execute `uptime`
      ansible.builtin.command:
        cmd: uptime
      register:
        _uptime: _task.result.stdout
      changed_when: true

    - name: Debug
      ansible.builtin.debug:
        msg: '{{ _uptime }}'

あれ、なんだか変ですね。 普段registerキーワードで変数に実行結果を保存するときは、register: 変数名のように書きます。 上記のPlaybookはvarsキーワードのように変数を代入しているように見えます。 Playbookを実行して、何が起こるのか確認してみましょう。

実行コマンドはfallible-playbookです。 ansible-playbookじゃないのでお気をつけください。

fallible-playbook playbook.yml

# (snip)

# TASK [Execute `uptime`] ******
# changed: [localhost]

# TASK [Debug uptime] ******
# ok: [localhost] => 
#     msg: ' 22:26:18 up  3:25,  2 users,  load average: 1.56, 1.99, 1.90'

なんと、_uptime変数にコマンド実行結果が格納されました。 Register Projectionsとは、以下のような機能になります。

  • registerキーワードにて変数を (複数) 作れる
  • registerキーワード内で変数代入する際、_task.resultというマジック変数から今のタスク実行結果にアクセスできる

今回の場合、1つ目のタスクのcommandモジュールの実行結果が_task.resultという変数に格納されています。 registerキーワード内ではこの_task.result変数を利用して_task.result.stdoutと指定することで、「uptimeコマンド実行後の標準出力」を取り出しています。 このように、Register Propergationsを利用した書き方により、タスクの実行結果をその場で整形できます。 私は、この書き方を採用することでレジスタ変数周りの可読性を大幅に向上できると期待しています。

Register Projectionsを使わない従来の書き方だと、整形の記述を次タスク以降で行う必要がありました。 具体的には以下のようになります。
(敢えていくつかの方法で書いてみます)

- name: Test2
  hosts: localhost
  gather_facts: false
  tasks:
    - name: Execute `uptime`
      ansible.builtin.command:
        cmd: uptime
      register: _uptime_result
      changed_when: true

    # パターン1. シンプル
    - name: Debug1
      ansible.builtin.debug:
        msg: '{{ _uptime_result.stdout }}'

    # パターン2. 可読性を上げるためにタスク変数で名前をつけるケースもあるでしょう
    - name: Debug2
      ansible.builtin.debug:
        msg: '{{ _uptime }}'
      vars:
        _uptime: '{{ _uptime_result.stdout }}'

    # パターン3. _uptimeをこの後何度も使う場合は、一度set_factに格納するケースもあるでしょう
    - name: Set fact _uptime
      ansible.builtin.set_fact:
        _uptime: '{{ _uptime_result.stdout }}'

    - name: Debug3
      ansible.builtin.debug:
        msg: '{{ _uptime }}'

Register Projectionsはパターン3の挙動に最も近いです。 整形されたタスク実行結果がAnsible実行終了までアクセス可能 (グローバル変数) であるためです。 パターン3ではset_factモジュールを使う関係で2タスクに分かれるところが、Register Projectionsを使えば1タスクで済みます。

とても便利なので、ぜひ正式実装されてほしいなと思います。

(蛇足) _taskの中身を表示することはできない

Register Projectionsにおいては、_task.resultがいわゆる「従来のレジスタ変数の中身」でした。 _taskにはどんなデータが入っているのでしょうか?

...残念ながら、Ansible実行により_task変数の中身を表示することはできませんでした。 以下のPlaybookを実行すると、debugモジュールの実行時に「_uptime_task変数が未定義」だと怒られます。 1つ目のタスクで_uptime_task: _task_uptime_task: _task.resultにすれば動くようになります。

- name: Test
  hosts: localhost
  gather_facts: false
  tasks:
    - name: Execute `uptime`
      ansible.builtin.command:
        cmd: uptime
      register:
        _uptime_task: _task
      changed_when: true

    - name: Debug _uptime_task
      ansible.builtin.debug:
        msg: '{{ _uptime_task }}'

設計がしっかりしてますね。

参考情報

リンク 説明
Fallible 2025.12.5 released with Register Projections and new Action API previews Ansible Forumの元記事
Register projections and action plugin dynamic host/group/var API #86241 機能追加のPull Request。使い方を詳しく書いてある



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

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