vars という名の var
varsを初めて知った。
--- - name: test hosts: localhost gather_facts: false vars: foo1bar: w foo2bar: wwwwwww tasks: - debug: msg: "{{ vars['foo' + item + 'bar'] }}" loop: "{{ range(1, 2 + 1, 1) | map('string') | list }}"
PLAY [test] ********************************************************************************************************************************************************************************* TASK [debug] ******************************************************************************************************************************************************************************** ok: [localhost] => (item=1) => { "msg": "w" } ok: [localhost] => (item=2) => { "msg": "wwwwwww" } PLAY RECAP ********************************************************************************************************************************************************************************** localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
こちらとか見ても載ってはいない。公式にはlookup('vars')がよいかも。 docs.ansible.com
Ansible / Jinja2 Filter 備忘録(ただのメモ)
逆引きでフィルタ方法の整理ができればと思ったが、一旦忘れないようにとりあえずメモ。 今度時間があったらまとめる。
リストから正規表現にマッチする要素のみを抽出する。
--- - hosts: localhost gather_facts: false vars: re: "^bar.*$" foo: - "bar1" - "baz2" # これだけフィルター - "bar3" tasks: - debug: msg: >- {{ foo | select('match', re) | list }}
ok: [localhost] => { "msg": [ "bar1", "bar3" ] }
'match' などの比較演算子は Template Designer Documentation — Jinja Documentation (3.0.x) を参考に。'eq'とか'le'とか色々。
辞書のリストから指定したkey, valueを持つ要素を抽出する。
--- - hosts: localhost gather_facts: false vars: foo: - bar: 1 baz: a - bar: 2 baz: a - bar: 3 # この辞書だけ該当しないのでフィルター baz: b # この辞書だけ該当しないのでフィルター - bar: 4 baz: a tasks: - debug: msg: >- {{ foo | selectattr('baz','eq','a') | list }}
ok: [localhost] => { "msg": [ { "bar": 1, "baz": "a" }, { "bar": 2, "baz": "a" }, { "bar": 4, "baz": "a" } ] }
動的に辞書のリストを作成する
--- - hosts: localhost gather_facts: false vars: foo: - a - b # このfooを元に以下の辞書リストを作りたい. # msg: # - baz: a # - baz: b tasks: - name: Set set_fact: bar: "{{ bar | default([]) + [{'baz': item}] }}" loop: "{{ foo }}" - debug: msg: "{{ bar }}"
または
--- - hosts: localhost gather_facts: false vars: foo: - a - b tasks: - name: Set set_fact: bar: |- {% set list = [] %} {% for i in foo %} {% set _ = list.append({'baz': i}) %} {% endfor %} {{ list }} - debug: msg: "{{ bar }}"
ok: [localhost] => { "msg": [ { "baz": "a" }, { "baz": "b" } ] }
辞書変数の操作(要素追加・削除)
--- - hosts: localhost gather_facts: false vars: foo: bar: a baz: b tasks: - debug: # 単純に辞書に要素(key, value)を追加したい場合 msg: >- {{ foo | combine({'qux': 'c'}) }} - debug: # 特定のkey要素を削除したい場合 msg: >- {{ foo | dict2items | rejectattr('key', 'eq', 'baz') | list | items2dict }} - debug: # 特定のkey要素を削除したい場合 (別パターン) msg: |- {% set _ = foo.pop('baz') %} {{ foo }}
TASK [debug] ********************************** ok: [localhost] => { "msg": { "bar": "a", "baz": "b", "qux": "c" } } TASK [debug] ********************************** ok: [localhost] => { "msg": { "bar": "a" } } TASK [debug] ********************************** ok: [localhost] => { "msg": { "bar": "a" } }