set_statsのper_hostが使えないときの代替手段

はじめに

awxにて、動的に生成した変数を、ジョブテンプレートを跨いで使用したい場合、set_statsモジュールで実現できます。

ただし、awxの制約事項として、per_hostパラメータはnoである必要があります。したがって、set_statsで設定した変数は、ホスト変数のようには扱えません。

github.com

しかし、ホストに紐づく変数を動的に生成して、後続のジョブテンプレートに持ち越したい、というケースはあるかと思います。そこで、下記のように自ホスト名をキーにすることで、なんちゃってホスト変数的な仕組みを考えました。

ホスト名:
  変数1:変数2:変数3:

取り出すときはlookupプラグインでキーを特定します。

ワークフロー

文字通り、set_statsジョブテンプレートでset_statsして、debug_statsジョブテンプレートで、設定したstatsを確認します。

f:id:ikiri96hyo:20201010183225p:plain

Playbook

set_stats

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Set a random integer
      set_fact:
        my_integers:
          int1: "{{ 655535 | random }}"
          int2: "{{ 655535 | random }}"
          int3: "{{ 655535 | random }}"

    - name: Debug my_integers
      debug:
        var: my_integers

    - name: Set stats
      set_stats:
        data: "{{ {inventory_hostname:my_integers } }}"

debug_stats

---
- hosts: all
  gather_facts: false
  tasks:
    - name: debug stats
      debug:
        msg: "{{ item }}"
      with_items:
        - "int1 is {{ lookup('vars', inventory_hostname).int1 }}"
        - "int2 is {{ lookup('vars', inventory_hostname).int2 }}"
        - "int3 is {{ lookup('vars', inventory_hostname).int3 }}"

実行結果

set_stats

PLAY [all] *********************************************************************

TASK [Set a random integer] ****************************************************
ok: [sv1]
ok: [sv2]

TASK [Debug my_integers] *******************************************************
ok: [sv1] => {
    "my_integers": {
        "int1": "164897",
        "int2": "560957",
        "int3": "302017"
    }
}
ok: [sv2] => {
    "my_integers": {
        "int1": "325519",
        "int2": "21610",
        "int3": "105839"
    }
}

TASK [Set stats] ***************************************************************
ok: [sv1]
ok: [sv2]

PLAY RECAP *********************************************************************
sv1                        : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
sv2                        : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

debug_stats

PLAY [all] *********************************************************************

TASK [debug stats] *************************************************************
ok: [sv1] => (item=int1 is 164897) => {
    "msg": "int1 is 164897"
}
ok: [sv1] => (item=int2 is 560957) => {
    "msg": "int2 is 560957"
}
ok: [sv1] => (item=int3 is 302017) => {
    "msg": "int3 is 302017"
}
ok: [sv2] => (item=int1 is 325519) => {
    "msg": "int1 is 325519"
}
ok: [sv2] => (item=int2 is 21610) => {
    "msg": "int2 is 21610"
}
ok: [sv2] => (item=int3 is 105839) => {
    "msg": "int3 is 105839"
}

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

画面左下の追加変数欄を見ると、想定通り、ホスト名をキーとして各変数が格納されていることがわかります。

f:id:ikiri96hyo:20201010190013p:plain