0
0

Ansible 配列が空の場合の処理(with_items)

Posted at

配列の空判定

インベントリやロールで空の配列を設定したときの
条件文についてのメモ書き

変数設定

vars/main.yml
List_A:
  - 'Apple'
  - 'Orange'
  - 'Banana'

List_B:

「List_A」にはリストを登録し、「List_B」は何も登録しない

空判定がうまくいかないパターン

playbook.yml
- hosts: localhost
  tasks:
    - name: List A Checks
      debug: msg="{{ item }}"
      with_items: "{{ List_A }}"
      when: List_A != ""

    - name: List B Checks
      debug: msg="{{ item }}"
      with_items: "{{ List_B }}"
      when: List_B != ""
実行結果
PLAY [localhost] ********************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [localhost]

TASK [List A Checks] ****************************************************************************************************************************
ok: [localhost] => (item=Apple) => {
    "msg": "Apple"
}
ok: [localhost] => (item=Orange) => {
    "msg": "Orange"
}
ok: [localhost] => (item=Banana) => {
    "msg": "Banana"
}

TASK [List B Checks] ****************************************************************************************************************************
ok: [localhost] => (item=None) => {
    "msg": null
}

PLAY RECAP **************************************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

変数が設定されていないが空が認識できずnullが出力される

空判定がうまくいくパターン

playbook.yml
- hosts: localhost
  tasks:
    - name: List A Checks
      debug: msg="{{ item }}"
      with_items: "{{ List_A }}"
      when: List_A

    - name: List B Checks
      debug: msg="{{ item }}"
      with_items: "{{ List_B }}"
      when: List_B
実行結果
PLAY [localhost] ********************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [localhost]

TASK [List A Checks] ****************************************************************************************************************************
ok: [localhost] => (item=Apple) => {
    "msg": "Apple"
}
ok: [localhost] => (item=Orange) => {
    "msg": "Orange"
}
ok: [localhost] => (item=Banana) => {
    "msg": "Banana"
}

TASK [List B Checks] ****************************************************************************************************************************
skipping: [localhost] => (item=None)
skipping: [localhost]

PLAY RECAP **************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

結論

リストの有無の判定のように記載しているが判定としてはtrue/falseの真偽を利用しているだけ。
本来ならlengthでの判定が一番良いのだろうが、自分の環境だとErrorしか返さないので、とりあえずこれで対応

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0