てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] ロールの処理を正常のまま止める meta モジュールのキーワード「end_role」

はじめに

Ansible には、やや特殊な ansible.builtin.meta というモジュールがあります。

このモジュールに、ロールの処理を正常のまま止めるキーワード end_role が、ansible-core 2.18.0 で追加されました。

changelogから:

Add a new meta task end_role (#22286)

現状は、devel の公式ドキュメントの ansible.builtin.meta のモジュールの説明に end_role が記載れています。

end_role (added in Ansible 2.18) causes the currently executing role to end without failing the host(s).

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

検証環境:

  • ansible-core 2.18.0

ansible.builtin.meta: end_role を試す

まず2つのロールを用意します。それぞれ、ちょとした debug を仕込んでいます。

role1 の方に ansible.builtin.meta: end_role を挟んでいます。これで role1 の次のタスク Task 1-2 が実行されないことを期待しています。

roles/role1/tasks/main.yml:

---
- name: Task 1-1
  ansible.builtin.debug:
    msg: 1-1

- name: End role
  ansible.builtin.meta: end_role    # 今回のポイント

- name: Task 1-2   # これは実行されない想定
  ansible.builtin.debug:
    msg: 1-2

roles/role2/tasks/main.yml

---
- name: Task 2-1
  ansible.builtin.debug:
    msg: 2-1

Playbook はこちら。ただ上述の2つのロールをインポートするだけです。

---
- name: Test play for end_role
  hosts: localhost
  gather_facts: false

  tasks:
    - name: Import role role1
      ansible.builtin.import_role:
        name: role1

    - name: Import role role2
      ansible.builtin.import_role:
        name: role2

それでは実行します。

% ansible-playbook -i localhost, import_role.yml

PLAY [Test play for end_role] *************************************************************************************

TASK [role1 : Task 1-1] *******************************************************************************************
ok: [localhost] => {
    "msg": "1-1"
}

TASK [role1 : End role] *******************************************************************************************

TASK [role2 : Task 2-1] *******************************************************************************************
ok: [localhost] => {
    "msg": "2-1"
}

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

期待通り role1 内の Task 1-2 は実行されず、次のロールである role2 の処理は実行されました。

なお、今回 end_role を仕込んだ場所に、代わりに end_play を仕込むと、Task 1-2 はもちろん、role2 の処理も実行されません。この比較がわかりやすいと思います。

おわりに

完全に余談ですが 「エンドロール」と聞くと映画の最後とかの end roll を連想してしまいます。