WENPE PLAYGROUND
WENPE PLAYGROUND
WENPE PLAYGROUND
WENPE PLAYGROUND

Image Not Found
#Ansible

2023.03.12

Ansibleのloopでbreakする方法

概要

Ansibleのloopで特定条件の時にbreakしてloopから抜ける方法を解説します。
この方法は、若干ハック気味の実装方法で、Ansibleの基本機能だけでは実装できません。(今のところ

ゴール

Ansibleのloopで特定条件の時にbreakできるようにする。

成果物

  • コミット:https://github.com/wenpe/playground/commit/137e4c1094340cc7c25d56417915cd046c40a2bc

内容

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