前提
version Ansible 2.8
目的
set_factを利用し、dictやlistを定義する方法。
背景
半構造データはvars/main.yml
やインベントリでyaml形式で定義出来るが、
動的にこういったデータを作成したい場合の文献がパッと出てこなかったので記事を書いた。
留意点
そもそも静的な変数の場合、varsやdefault変数として定義して方が良い。
あくまでregisterなどを使った後、動的な変数を作成したい場合にset_factは利用される。
set_factは変数としての優先度が高く、他のtask、roleなどを跨いだ場合も有効。
影響範囲が大きいので極力vars、defaultか、インベントリに定義した変数を利用すべき。
具体的なコード
- dictの場合
- defaultフィルターを利用し空のdictを定義、そのdictに対し値を定義していく。
- defaultフィルターを利用せず
dict_hoge
に値を入れようとするとundefinedのエラーが発生するので注意。 - combineフィルターを利用し、空のdictに対し値を適用させていく。
- name: define dict
set_fact:
dict_hoge: "{{ dict_hoge: | default({}) | combine( {"key1": "value1", "key2", "value2"} ) }}"
- listの場合
- defaultフィルターを利用し空のlistを定義、そのdictに対し値を定義していく。
- defaultフィルターを利用せず
dict_hoge
に値を入れようとするとundefinedのエラーが発生するので注意。
- name: define list
set_fact:
list_hoge: "{{ list_hoge: | default([]) + ["value1", "value2"] }}"
おまけ
構造データ作成時のタイポでなぜかjsonではなくunicodeになる。
単純ミスからえぐいハマり方をした。
- name: define list
set_fact:
list_hoge: "{{ list_hoge: | default([]) + ["value1"] }}"
- debug:
msg: " {{ list_hoge}}"
# ^ ここに半角スペースが入ってるせいでunicodeになる、つまりlist_hoge[0]などするとエラーが出る。
参考文献