配列の空判定
インベントリやロールで空の配列を設定したときの
条件文についてのメモ書き
変数設定
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しか返さないので、とりあえずこれで対応