めも(仮)

個人的に書き留めておきたい技術情報をまとめておく場です。

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