set_statsのper_hostが使えないときの代替手段
はじめに
awxにて、動的に生成した変数を、ジョブテンプレートを跨いで使用したい場合、set_stats
モジュールで実現できます。
ただし、awxの制約事項として、per_host
パラメータはno
である必要があります。したがって、set_stats
で設定した変数は、ホスト変数のようには扱えません。
しかし、ホストに紐づく変数を動的に生成して、後続のジョブテンプレートに持ち越したい、というケースはあるかと思います。そこで、下記のように自ホスト名をキーにすることで、なんちゃってホスト変数的な仕組みを考えました。
ホスト名: 変数1: 値 変数2: 値 変数3: 値
取り出すときはlookupプラグインでキーを特定します。
ワークフロー
文字通り、set_statsジョブテンプレートでset_statsして、debug_statsジョブテンプレートで、設定したstatsを確認します。
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
画面左下の追加変数欄を見ると、想定通り、ホスト名をキーとして各変数が格納されていることがわかります。