本記事は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。使い方を詳しく書いてある |