てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] loop を抜ける条件を指定する break_when

この記事は Ansible Advent Calendar 2024 の 12日目の記事です。

はじめに

タスクを loop で実行する際、ループを抜ける条件を指定する break_when というキーワードが、ansible-core 2.18.0 で追加されました。

changelogから:

loop_control - add a break_when option to to break out of a task loop early based on Jinja2 expressions (#83442).

公式ドキュメント: Breaking out of a loop

せっかくなので試してみました。

検証環境:

  • ansible-core 2.18.0

break_when を試す

以下の Playbook で試します。1 から 5 までループしですが、3 まででループを終わらせるものです。

---
- name: Test Play
  hosts: localhost
  connection: local
  gather_facts: false

  vars:
  tasks:
    - name: Test break_when
      ansible.builtin.debug:
        msg: "{{ item }}"
      loop:
        - 1
        - 2
        - 3
        - 4
        - 5
      loop_control:
        break_when:
          - item == 3

実行結果は以下のとおりです。

$ ansible-playbook -i localhost, break_when.yml

PLAY [Test Play] ***************************************************************************************************

TASK [Test break_when] *********************************************************************************************
ok: [localhost] => (item=1) => {
    "msg": 1
}
ok: [localhost] => (item=2) => {
    "msg": 2
}
ok: [localhost] => (item=3) => {
    "msg": 3
}

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

3「まで」ループして、4 と 5 は処理されませんでした。skipにもならないのでログがすっきりしていますね。

おわりに

これまでこういう機能を使いたいことがあったようななかったような、という感じですが、もしかしたら今後使いたいときがくるかもしれません。