2023.03.12
Ansibleのloopで特定条件の時にbreakしてloopから抜ける方法を解説します。
この方法は、若干ハック気味の実装方法で、Ansibleの基本機能だけでは実装できません。(今のところ
Ansibleのloopで特定条件の時にbreakできるようにする。
Pythonでloopからbreakするときは以下のような形になると思います。
loop_items = [
"not target",
"not target",
"target",
"not target",
"not target",
]
for item in loop_items:
print(item)
if item == "target":
break
結果
not target
not target
target
上記のように、target以降の処理をしないようにAnsibleで記載してみます。
---
- name: Break loop sample
hosts: localhost
tasks:
- name: Break loop
ansible.builtin.debug:
msg: "{{ item }}"
loop:
- not target
- not target
- target
- not target
- not target
register: _res
when: (_res.item | default("not target")) != "target"
結果
PLAY [Break loop sample] *****************************************************************************************************************************************
TASK [Break loop] ************************************************************************************************************************************************
ok: [localhost] => (item=not target) => {
"msg": "not target"
}
ok: [localhost] => (item=not target) => {
"msg": "not target"
}
ok: [localhost] => (item=target) => {
"msg": "target"
}
skipping: [localhost] => (item=not target)
skipping: [localhost] => (item=not target)
PLAY RECAP *******************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ポイントを簡単に解説します。
Ansibleのloopをbreakして抜ける場合は、breakするタイミングでwhenをfalseにすることで、その後の処理をskipさせることができます。
今回、whenの条件は、タスクの実行結果を元に評価したいので、結果をregisterで_resにセットし、_resを評価するようにします。
これだけ考えると、結構簡単な気がするのですが、一つ問題があります。それは、loopの1回目は_resがセットされる前にwhenが評価されるため、_resがないことによってエラーになることです。
これを回避するため、_resがセットされていない場合、whenが必ずtrueになるような値をdefaultでセットすることで、loopの1回目を必ず成功させるようにしています。
ポイントはこれだけです。
実装と解説は以上です。
© 2023 Wenpe