てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] ansible-core 2.16 からタスクの成功を条件とするリトライには until が不要になった

この記事は Ansible Advent Calendar 2023 の 18日目の記事です。

はじめに

これまで、retries を指定していても until の指定がない場合は、リトライ処理が行われませんでした。

ansible-core 2.16 (Ansible community Package としては 9)で、タスクの成功を条件とする場合は until の指定が不要になりました。

CHANGELOG から引用

the retries keyword can be specified without until in which case the task is retried until it succeeds but at most retries times

これまでとの比較や、今回の書き方を試した結果をまとめます。

  • 検証環境
    • ansible-core 2.16

そもそも untilretries とは

Anislbe には「タスクの実行結果が○○になるまでそのタスクの実行を繰り返す」機能があります。

条件は until ディレクティブで指定します。例えば以下のような条件を指定できます。

  • タスクの実行が成功するまで
  • 実行結果内の x の値が true になるまで

また、最大何回リトライするか指定する retries というディレクティブがあります。

たとえば、タスクの実行が成功するまで最大3回リトライするす場合、今までは以下のよう指定する必要がありました。

    - name: Get request until success
      uri:
        url: https://192.168.1.30
        validate_certs: false
        timeout: 5
      register: result_uri
      retries: 3
      until:    # 単純なタスク成功を条件とする場合でもuntil とセットで指定する必要がある
        - result_uri is success

ansible-core 2.16.0 でシンプルにかけるようになった

先程の例の場合、ansible-core 2.16.0 のように until が不要になりました。

    - name: Get request until success
      uri:
        url: https://192.168.1.30
        validate_certs: false
        timeout: 5
      retries: 3

この例では、until の判定のためだけに register を指定していたので register の指定もなくせています。

実行例: (途中で成功している場合)

%  ansible-playbook -i localhost, retries.yml

PLAY [localhost] ******************************************************************

TASK [Get request until success] **************************************************
FAILED - RETRYING: [localhost]: Get request until success (3 retries left).
FAILED - RETRYING: [localhost]: Get request until success (2 retries left).
ok: [localhost]

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

なお、この Playbook を ansible-2.16 未満で実行すると、リトライせずに1発でエラーになります。

until が不要なケースと必要なケース

あくまでも今回の改善、タスクが成功するまでという条件の場合だけ until が不要になっただけです。 なので、それ以外の条件(例: 実行結果内の x の値が true になるまで)はこれまで同様に until の指定が必要です。

おわりに

タスクの成功を条件とする場合のリトライ、という条件付きではありますが、シンプルな場合にシンプルに書けるようになったのは、地味に嬉しいと思いました。

参考

Retrying a task until a condition is met:

docs.ansible.com

If until is not specified, the task will retry until the task succeeds but at most retries times.

関連 issue:

github.com

関連 PR:

github.com

関連 PR (ドキュメント):

github.com