Ansible Playbook タグの継承


Ansible Playbook のタグについて、混乱する挙動があったので調べてみました。
タグの継承についてです。
https://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html#tag-inheritance

tagtest.yml
- name: Test Tag
  hosts: localhost
  connection: local
  tasks:
    - name: "step_1"
      debug:
        msg: "こんにちは"
    - name: "step_2"
      debug:
        msg: "hello"
      tags:
        - hello

この Playbook を hello タグを指定して実行すると、タグが付いていない step_1 タスクは無視され、step_2 タスクのみが実行されます。

ここまでは想定通りです。

では、この Play 自身にも次のように hello タグが付与されている場合、hello タグを指定して実行するとどのタスクが実行されるでしょう。

tagtest.yml
- name: Test Tag
  hosts: localhost
  connection: local
  tasks:
    - name: "step_1"
      debug:
        msg: "こんにちは"
    - name: "step_2"
      debug:
        msg: "hello"
      tags:
        - hello
  tags:
    - hello

実行結果は次の通りです。

$ ansible-playbook tagtest.yml -t "hello"

PLAY [Test Tag] ************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [step_1] **************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "こんにちは"
}

TASK [step_2] **************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "hello"
}

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

タグの付いていない step_1 も含め、すべてのタスクが実行されています。

この挙動に最初は混乱していたのですが、タスクはその親に当たる Play からタグを継承していて、step_1 タスクにも hello タグが付いているのだと分かりました。

一つの Playbook に複数の Play が含まれている場合。以下の Playbook を、hello タグを指定して実行すると、「こんにちは」「hello」「Ciao」が出力されます。

tagtest.yml
- name: "Test Tag 1"
  hosts: localhost
  connection: local
  tasks:
    - name: "step_1"
      debug:
        msg: "こんにちは"
    - name: "step_2"
      debug:
        msg: "hello"
      tags:
        - hello
  tags:
    - hello

- name: "Test Tag 2"
  hosts: localhost
  connection: local
  tasks:
    - name: "step_1"
      debug:
        msg: "Hola"
    - name: "step_2"
      debug:
        msg: "Ciao"
      tags:
        - hello