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"
}
}