はじめに
各ホストに対するタスクの結果をregisterで変数に格納し、結果を1つの変数に
集約したいということがあります。今回はこれをjson_query filterで実現してみようと思います。
TL;DR
- ホストごとにregisterで変数に格納した結果は、{{ hostvars['<ホスト名>']} }で呼び出すことが可能
- ホストごとにregisterで変数に格納した結果は、json_query filterでlocalhostに集約する
前提条件
- Ansibleにおけるフィルターの使い方を理解していること
実行環境
- ansible-core: 2.16.0
詳細
1. 実行するPlaybook
- Playbookでは大きくわけて以下2つのことを実行します
- ホストごとのdebugモジュールの結果を、変数register_resultに格納する
- ホストごとに定義した変数register_resultを、json_query filterでlocalhostの変数aggregate_resultに集約する
 
- ホストごとのdebugモジュールの結果を、変数
aggregate_register.yml
---
- name: "Aggregate register"
  hosts: host01,host02
  gather_facts: false
  tasks:
    - name: Define register_result
      ansible.builtin.debug:
        msg: "Hello {{ inventory_hostname }}"
      register: register_result
    
    - name: Display variables
      ansible.builtin.debug:
        msg:
          - "register_result: {{ register_result }}"
          - "hostvars['host01'].register_result: {{ hostvars['host01'].register_result }}"
          - "hostvars['host02'].register_result: {{ hostvars['host02'].register_result }}"
    
    - name: Aggregate Variable to aggregate_result
      ansible.builtin.set_fact:
        aggregate_result: >-
          {{ hostvars | community.general.json_query("*.register_result") }} 
      delegate_to: localhost
      run_once: true
    - name: Display aggregate_result
      ansible.builtin.debug:
        var: aggregate_result
      delegate_to: localhost
      run_once: true
2. 実行結果
ホストごとにregisterで変数に格納した結果は、{{ hostvars['<ホスト名>']} }に格納されるので、
これを活用してlocalhostの変数aggregate_resultに集約します
$ ansible-navigator run aggregate_register.yml -i inventory -m stdout
PLAY [Aggregate register] ******************************************************
TASK [Define register_result] **************************************************
ok: [host01] => {
    "msg": "Hello host01"
}
ok: [host02] => {
    "msg": "Hello host02"
}
TASK [Display variables] *******************************************************
ok: [host01] => {
    "msg": [
        "register_result: {'msg': 'Hello host01', 'failed': False, 'changed': False}",
        "hostvars['host01'].register_result: {'msg': 'Hello host01', 'failed': False, 'changed': False}",
        "hostvars['host02'].register_result: {'msg': 'Hello host02', 'failed': False, 'changed': False}"
    ]
}
ok: [host02] => {
    "msg": [
        "register_result: {'msg': 'Hello host02', 'failed': False, 'changed': False}",
        "hostvars['host01'].register_result: {'msg': 'Hello host01', 'failed': False, 'changed': False}",
        "hostvars['host02'].register_result: {'msg': 'Hello host02', 'failed': False, 'changed': False}"
    ]
}
TASK [Aggregate Variable to aggregate_result] **********************************
ok: [host01 -> localhost]
TASK [Display aggregate_result] ************************************************
ok: [host01 -> localhost] => {
    "aggregate_result": [
        {
            "changed": false,
            "failed": false,
            "msg": "Hello host01"
        },
        {
            "changed": false,
            "failed": false,
            "msg": "Hello host02"
        }
    ]
}
PLAY RECAP *********************************************************************
host01                     : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host02                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
さいごに
- json_query filterを使いこなすと、変数から必要な個所をだけを抽出することができる
- json_query filterにおけるクエリの書き方は、JMESPath Tutorial
 を参考にするとよい
