Chapter 27

タグ#2

y_mrok
y_mrok
2022.01.23に更新

インベントリー

使用するインベントリーファイルです。

hosts.yml
---
all:
  children:
    web:
      hosts:
        marutamachi:
        takeyamachi:
        ebisugawa:
        nijyo:
    mail:
      hosts:
        nijyo:
    database:
      hosts:
        oshikoji:
        oike:

block ディレクティブ

各タスクにタグを設定

block ディレクティブ、 rescue ディレクティブ、 always ディレクティブの各タスクにタグを付けることができます。 -t / -tags パラメーターで実行するタスクのタグを指定したり --skip-tags パラメーターで実行から除外するタスクを指定したりします。

tags2.yml
---
- name: Examples of tag usage
  hosts: database
  gather_facts: no

  tasks:
    - name: task1
      ansible.builtin.debug:
    - name: task2
      ansible.builtin.debug:
      tags: job1
    - name: task3
      ansible.builtin.debug:
      tags: job2
    - name: Grouping tasks.
      block:
        - name: task4 (block)
          ansible.builtin.fail:
        - name: task5 (block)
          ansible.builtin.fail:
          tags: job1
        - name: task6 (block)
          ansible.builtin.fail:
          tags: job2
      rescue:
        - name: task7 (rescue)
          ansible.builtin.debug:
        - name: task8 (rescue)
          ansible.builtin.debug:
          tags: job1
      always:
        - name: task9 (alwasys)
          ansible.builtin.debug:
        - name: task10 (always)
          ansible.builtin.debug:
          tags: job1
        - name: task11(always)
          ansible.builtin.debug:
          tags: job2
    - name: task12
      ansible.builtin.debug:
    - name: task13
      ansible.builtin.debug:
      tags: job1
    - name: task14
      ansible.builtin.debug:
      tags: job2

実行対象のタグを指定した実行ログです。指定したタグのタスクだけを実行しました。

y_mrok@ctrl:~/code/exam16$ ansible-playbook -i hosts.yml -t job1 tags2.yml

PLAY [Examples of tag usage] *************************************************************************************************************************

TASK [task2] *****************************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

TASK [task5 (block)] *********************************************************************************************************************************
fatal: [oshikoji]: FAILED! => {"changed": false, "msg": "Failed as requested from task"}
fatal: [oike]: FAILED! => {"changed": false, "msg": "Failed as requested from task"}

TASK [task8 (rescue)] ********************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

TASK [task10 (always)] *******************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

TASK [task13] ****************************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

PLAY RECAP *******************************************************************************************************************************************
oike                       : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=1    ignored=0   
oshikoji                   : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=1    ignored=0   

y_mrok@ctrl:~/code/exam16$ 

実行対象から除外するタグを指定した実行ログです。指定したタグ以外のタスクを実行しました。

y_mrok@ctrl:~/code/exam16$ ansible-playbook -i hosts.yml --skip-tags job2 tags2.yml

PLAY [Examples of tag usage] *************************************************************************************************************************

TASK [task1] *****************************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

TASK [task2] *****************************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

TASK [task4 (block)] *********************************************************************************************************************************
fatal: [oshikoji]: FAILED! => {"changed": false, "msg": "Failed as requested from task"}
fatal: [oike]: FAILED! => {"changed": false, "msg": "Failed as requested from task"}

TASK [task7 (rescue)] ********************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

TASK [task8 (rescue)] ********************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

TASK [task9 (alwasys)] *******************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

TASK [task10 (always)] *******************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

TASK [task12] ****************************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

TASK [task13] ****************************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

PLAY RECAP *******************************************************************************************************************************************
oike                       : ok=8    changed=0    unreachable=0    failed=0    skipped=0    rescued=1    ignored=0   
oshikoji                   : ok=8    changed=0    unreachable=0    failed=0    skipped=0    rescued=1    ignored=0   

y_mrok@ctrl:~/code/exam16$ 

rescue ディレクティブ使用時の注意

タグを指定して実行したとき、 block ディレクティブでタグを付けたタスクでエラーが発生したが rescue ディレクティブでタグを付けたタスクが存在しない場合はレスキューされず、エラーとして処理します。上記のプレイブックの rescue ディレクティブにタグ job2 を付けたタスクは存在しません。この状態で block ディレクティブでタグ job2 を付けたタスクでエラーが発生した場合はレスキューされず、通常のエラー処理を実施します。

y_mrok@ctrl:~/code/exam16$ ansible-playbook -i hosts.yml -t job2 tags2.yml 

PLAY [Examples of tag usage] *************************************************************************************************************************

TASK [task3] *****************************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

TASK [task6 (block)] *********************************************************************************************************************************
fatal: [oshikoji]: FAILED! => {"changed": false, "msg": "Failed as requested from task"}
fatal: [oike]: FAILED! => {"changed": false, "msg": "Failed as requested from task"}

TASK [task11(always)] ********************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

PLAY RECAP *******************************************************************************************************************************************
oike                       : ok=2    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   
oshikoji                   : ok=2    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   

y_mrok@ctrl:~/code/exam16$ 

タグの継承

ブロック自体に tags ディレクティブを設定すると block ディレクティブ、 rescure ディレクティブ、 always ディレクティブ内のすべてのタスクに継承(適用)します。これは become ディレクティブや when ディレクティブと同じ動作です。
次のプレイブックはブロック自体にタグ job4 を設定しました。

tags3.yml
---
- name: Examples of tag usage
  hosts: database
  gather_facts: no

  tasks:
    - name: task1
      ansible.builtin.debug:
    - name: task2
      ansible.builtin.debug:
      tags: job1
    - name: task3
      ansible.builtin.debug:
      tags: job2
    - name: Grouping tasks.
      block:
        - name: task4 (block)
          ansible.builtin.fail:
        - name: task5 (block)
          ansible.builtin.fail:
          tags: job1
        - name: task6 (block)
          ansible.builtin.fail:
          tags: job2
      rescue:
        - name: task7 (rescue)
          ansible.builtin.debug:
        - name: task8 (rescue)
          ansible.builtin.debug:
          tags: job1
      always:
        - name: task9 (alwasys)
          ansible.builtin.debug:
        - name: task10 (always)
          ansible.builtin.debug:
          tags: job1
        - name: task11(always)
          ansible.builtin.debug:
          tags: job2
      tags: job4
    - name: task12
      ansible.builtin.debug:
    - name: task13
      ansible.builtin.debug:
      tags: job1
    - name: task14
      ansible.builtin.debug:
      tags: job2

タグ job4 を指定した実行ログです。タグ job4 はブロック内のすべてのタスクに設定されるため、 block ディレクティブのタスクでエラーが発生した後は rescue ディレクティブと always ディレクティブのすべてのタスクを実行しました。

y_mrok@ctrl:~/code/exam16$ ansible-playbook -i hosts.yml -t job4 tags3.yml 

PLAY [Examples of tag usage] *************************************************************************************************************************

TASK [task4 (block)] *********************************************************************************************************************************
fatal: [oshikoji]: FAILED! => {"changed": false, "msg": "Failed as requested from task"}
fatal: [oike]: FAILED! => {"changed": false, "msg": "Failed as requested from task"}

TASK [task7 (rescue)] ********************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

TASK [task8 (rescue)] ********************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

TASK [task9 (alwasys)] *******************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

TASK [task10 (always)] *******************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

TASK [task11(always)] ********************************************************************************************************************************
ok: [oshikoji] => {
    "msg": "Hello world!"
}
ok: [oike] => {
    "msg": "Hello world!"
}

PLAY RECAP *******************************************************************************************************************************************
oike                       : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=1    ignored=0   
oshikoji                   : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=1    ignored=0   

y_mrok@ctrl:~/code/exam16$ 

ansible.builtin.import_tasks モジュール

ansible.builtin.import_tasks モジュールを使用したタスクに tags ディレクティブを設定した場合、取り込むファイルに含まれるすべてのタスクに継承(適用)されます。すなわち、読み込むファイルに含まれるすべてのタスクに tags ディレクティブで指定したタグを設定したのと同じ動作をします。

tags4.yml
---
- name: Examples of tag usage
  hosts: web
  become: yes

  tasks:
    - name: Install the httpd package.
      ansible.builtin.import_tasks:
        file: install-httpd.yml
      when: ansible_facts['os_family'] == "RedHat"
      tags: redhat

    - name: Install the apache2 package.
      ansible.builtin.import_tasks:
        file: install-apache2.yml
      when: ansible_facts['os_family'] == "Debian"
      tags: debian
install-httpd.yml
- name: Install the latest version of the httpd package
  ansible.builtin.yum:
    name: httpd
    state: latest
  tags: install
- name: Set the server name for Apache
  ansible.builtin.lineinfile:
    path: "/etc/httpd/conf/httpd.conf"
    regexp: "^#ServerName"
    line: "ServerName {{ ansible_facts['fqdn'] }}:80"
    state: present
  tags: config
- name: Syntax check of httpd.conf
  ansible.builtin.command: apachectl configtest
  tags: config 
- name: Restart or start httpd.service
  ansible.builtin.systemd:
    name: httpd.service
    enabled: yes
    state: restarted
  tags: service
- name: Start the firewalld.service
  ansible.builtin.systemd:
    name: firewalld.service
    enabled: yes
    state: started
  tags: firewall
- name: Open a hole in the firewall of the CentOS management node for the http port
  ansible.posix.firewalld:
    service: http
    zone: public
    permanent: yes
    immediate: yes
    state: enabled
  tags: firewall
install-apache2.yml
- name: Install the latest version of the apache2 package
ansible.builtin.apt:
  name: apache2
  state: latest
tags: install
- name: Set the server name for Apache2
ansible.builtin.lineinfile:
  path: "/etc/apache2/apache2.conf"
  insertafter: "^#ServerRoot "
  line: "ServerName {{ ansible_facts['hostname'] }}.exam.local"
  state: present
tags: config
- name: Syntax check of apache2.conf
ansible.builtin.command: apache2ctl configtest 
tags: config
- name: Restart or start apache2.service
ansible.builtin.systemd:
  name: apache2.service
  enabled: yes
  state: restarted
tags: service
- name: Open a hole in the firewall of the Ubuntu management node for the http port
community.general.ufw:
  rule: allow
  port: http
  proto: tcp
  state: enabled
tags: firewall

タグ redhat を指定した実行ログです。 ansible.builtin.import_tasks モジュールを使用したタスクに tags ディレクティブでタグを設定した場合、設定したタグは取り込むファイル内のすべてのタスクに継承されます。従って、タグ redhat を指定してプレイブックを実行するとタスク Install the httpd package. を実行し、「 install-httpd.yml 」ファイル内の各タスクが実行されました。

y_mrok@ctrl:~/code/exam16$ ansible-playbook -i hosts.yml -t redhat tags4.yml 

PLAY [Examples of tag usage] *************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************
ok: [takeyamachi]
ok: [marutamachi]
ok: [nijyo]
ok: [ebisugawa]

TASK [Install the latest version of the httpd package] ***********************************************************************************************
skipping: [ebisugawa]
skipping: [nijyo]
changed: [marutamachi]
changed: [takeyamachi]

TASK [Set the server name for Apache] ****************************************************************************************************************
skipping: [ebisugawa]
skipping: [nijyo]
changed: [takeyamachi]
changed: [marutamachi]

TASK [Syntax check of httpd.conf] ********************************************************************************************************************
skipping: [ebisugawa]
skipping: [nijyo]
changed: [takeyamachi]
changed: [marutamachi]

TASK [Restart or start httpd.service] ****************************************************************************************************************
skipping: [ebisugawa]
skipping: [nijyo]
changed: [takeyamachi]
changed: [marutamachi]

TASK [Start the firewalld.service] *******************************************************************************************************************
skipping: [ebisugawa]
skipping: [nijyo]
changed: [takeyamachi]
changed: [marutamachi]

TASK [Open a hole in the firewall of the CentOS management node for the http port] *******************************************************************
skipping: [ebisugawa]
skipping: [nijyo]
changed: [marutamachi]
changed: [takeyamachi]

PLAY RECAP *******************************************************************************************************************************************
ebisugawa                  : ok=1    changed=0    unreachable=0    failed=0    skipped=6    rescued=0    ignored=0   
marutamachi                : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
nijyo                      : ok=1    changed=0    unreachable=0    failed=0    skipped=6    rescued=0    ignored=0   
takeyamachi                : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

y_mrok@ctrl:~/code/exam16$ 

ansible.builtin.include_tasks モジュール

ansible.builtin.include_tasks モジュールを使用したタスクに tags ディレクティブを設定した場合、タスク自体にタグが設定されます。取り込むファイルに含まれるすスクにタグは継承(適用)されません。

tags5.yml
---
- name: Examples of tag usage
  hosts: web
  become: yes

  tasks:
    - name: Install the httpd package.
      ansible.builtin.include_tasks:
        file: install-httpd.yml
      when: ansible_facts['os_family'] == "RedHat"
      tags: redhat

    - name: Install the apache2 package.
      ansible.builtin.include_tasks:
        file: install-apache2.yml
      when: ansible_facts['os_family'] == "Debian"
      tags: debian
install-httpd.yml
- name: Install the latest version of the httpd package
  ansible.builtin.yum:
    name: httpd
    state: latest
  tags: install
- name: Set the server name for Apache
  ansible.builtin.lineinfile:
    path: "/etc/httpd/conf/httpd.conf"
    regexp: "^#ServerName"
    line: "ServerName {{ ansible_facts['fqdn'] }}:80"
    state: present
  tags: config
- name: Syntax check of httpd.conf
  ansible.builtin.command: apachectl configtest
  tags: config 
- name: Restart or start httpd.service
  ansible.builtin.systemd:
    name: httpd.service
    enabled: yes
    state: restarted
  tags: service
- name: Start the firewalld.service
  ansible.builtin.systemd:
    name: firewalld.service
    enabled: yes
    state: started
  tags: firewall
- name: Open a hole in the firewall of the CentOS management node for the http port
  ansible.posix.firewalld:
    service: http
    zone: public
    permanent: yes
    immediate: yes
    state: enabled
  tags: firewall
install-apache2.yml
- name: Install the latest version of the apache2 package
ansible.builtin.apt:
  name: apache2
  state: latest
tags: install
- name: Set the server name for Apache2
ansible.builtin.lineinfile:
  path: "/etc/apache2/apache2.conf"
  insertafter: "^#ServerRoot "
  line: "ServerName {{ ansible_facts['hostname'] }}.exam.local"
  state: present
tags: config
- name: Syntax check of apache2.conf
ansible.builtin.command: apache2ctl configtest 
tags: config
- name: Restart or start apache2.service
ansible.builtin.systemd:
  name: apache2.service
  enabled: yes
  state: restarted
tags: service
- name: Open a hole in the firewall of the Ubuntu management node for the http port
community.general.ufw:
  rule: allow
  port: http
  proto: tcp
  state: enabled
tags: firewall

タグ redhat を指定した実行ログです。 ansible.builtin.include_tasks モジュールを使用したタスクに tags ディレクティブでタグを設定した場合、設定したタグはタスク自体に設定されます。上記のプレイブックで取り込むファイル(「 install-httpd.yml 」ファイル)にタグ redhat が設定されたタスクが存在しません。よって、 ansible.builtin.include_tasks モジュールを設定したタスク Install the httpd package. を実行しましたが、取り込むファイル内のタスクは 1 つも実行しませんでした。

y_mrok@ctrl:~/code/exam16$ ansible-playbook -i hosts.yml -t redhat tags5.yml 

PLAY [Examples of tag usage] *************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************
ok: [takeyamachi]
ok: [nijyo]
ok: [marutamachi]
ok: [ebisugawa]

TASK [Install the httpd package.] ********************************************************************************************************************
skipping: [ebisugawa]
skipping: [nijyo]
included: /home/y_mrok/code/exam16/install-httpd.yml for marutamachi, takeyamachi

PLAY RECAP *******************************************************************************************************************************************
ebisugawa                  : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
marutamachi                : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
nijyo                      : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
takeyamachi                : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

y_mrok@ctrl:~/code/exam16$ 

ansible.builtin.import_role モジュール

ansible.builtin.import_roles モジュールを使用したタスクに tags ディレクティブを設定した場合、「 roles/ロール名/tasks/main.yml 」ファイルに含まれるすべてのタスクに継承(適用)されます。すなわち、「 roles/ロール名/tasks/main.yml 」ファイルに含まれるすべてのタスクに tags ディレクティブで指定したタグを設定したのと同じ動作をします。

tags6.yml
---
- name: Examples of tag usage
  hosts: web
  become: yes

  tasks:
    - name: Install the httpd package.
      ansible.builtin.import_role:
        name: install-httpd
      when: ansible_facts['os_family'] == "RedHat"
      tags: redhat

    - name: Install the apache2 package.
      ansible.builtin.import_role:
        name: install-apache2
      when: ansible_facts['os_family'] == "Debian"
      tags: debian
roles/install-httpd/tasks/main.yml
- name: Install the latest version of the httpd package
  ansible.builtin.yum:
    name: httpd
    state: latest
  tags: install
- name: Set the server name for Apache
  ansible.builtin.lineinfile:
    path: "/etc/httpd/conf/httpd.conf"
    regexp: "^#ServerName"
    line: "ServerName {{ ansible_facts['fqdn'] }}:80"
    state: present
  tags: config
- name: Syntax check of httpd.conf
  ansible.builtin.command: apachectl configtest
  tags: config 
- name: Restart or start httpd.service
  ansible.builtin.systemd:
    name: httpd.service
    enabled: yes
    state: restarted
  tags: service
- name: Start the firewalld.service
  ansible.builtin.systemd:
    name: firewalld.service
    enabled: yes
    state: started
  tags: firewall
- name: Open a hole in the firewall of the CentOS management node for the http port
  ansible.posix.firewalld:
    service: http
    zone: public
    permanent: yes
    immediate: yes
    state: enabled
  tags: firewall
roles/install-apache2/tasks/main.yml
- name: Install the latest version of the apache2 package
ansible.builtin.apt:
  name: apache2
  state: latest
tags: install
- name: Set the server name for Apache2
ansible.builtin.lineinfile:
  path: "/etc/apache2/apache2.conf"
  insertafter: "^#ServerRoot "
  line: "ServerName {{ ansible_facts['hostname'] }}.exam.local"
  state: present
tags: config
- name: Syntax check of apache2.conf
ansible.builtin.command: apache2ctl configtest 
tags: config
- name: Restart or start apache2.service
ansible.builtin.systemd:
  name: apache2.service
  enabled: yes
  state: restarted
tags: service
- name: Open a hole in the firewall of the Ubuntu management node for the http port
community.general.ufw:
  rule: allow
  port: http
  proto: tcp
  state: enabled
tags: firewall

タグ debian を指定した実行ログです。 ansible.builtin.import_role モジュールを使用したタスクに tags ディレクティブでタグを設定した場合、設定したタグは「 roles/ロール名/tasks/main.yml 」ファイルに含まれるすべてのタスクに継承されます。従って、タグ debian を指定してプレイブックを実行するとタスク Install the apache2 package. を実行し、「 roles/install-apache2/tasks/main.yml 」ファイル内の各タスクが実行されました。

y_mrok@ctrl:~/code/exam16$ ansible-playbook -i hosts.yml -t debian tags6.yml 

PLAY [Examples of tag usage] *************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************
ok: [takeyamachi]
ok: [marutamachi]
ok: [nijyo]
ok: [ebisugawa]

TASK [install-apache2 : Install the latest version of the apache2 package] ***************************************************************************
skipping: [marutamachi]
skipping: [takeyamachi]
changed: [ebisugawa]
changed: [nijyo]

TASK [install-apache2 : Set the server name for Apache2] *********************************************************************************************
skipping: [marutamachi]
skipping: [takeyamachi]
changed: [ebisugawa]
changed: [nijyo]

TASK [install-apache2 : Syntax check of apache2.conf] ************************************************************************************************
skipping: [marutamachi]
skipping: [takeyamachi]
changed: [ebisugawa]
changed: [nijyo]

TASK [install-apache2 : Restart or start apache2.service] ********************************************************************************************
skipping: [marutamachi]
skipping: [takeyamachi]
changed: [nijyo]
changed: [ebisugawa]

TASK [install-apache2 : Open a hole in the firewall of the Ubuntu management node for the http port] *************************************************
skipping: [marutamachi]
skipping: [takeyamachi]
changed: [ebisugawa]
changed: [nijyo]

PLAY RECAP *******************************************************************************************************************************************
ebisugawa                  : ok=6    changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
marutamachi                : ok=1    changed=0    unreachable=0    failed=0    skipped=5    rescued=0    ignored=0   
nijyo                      : ok=6    changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
takeyamachi                : ok=1    changed=0    unreachable=0    failed=0    skipped=5    rescued=0    ignored=0   

y_mrok@ctrl:~/code/exam16$ 

ansible.builtin.include_role モジュール

ansible.builtin.include_role モジュールを使用したタスクに tags ディレクティブを設定した場合、タスク自体にタグが設定されます。「 roles/ロール名/tasks/main.yml 」ファイルに含まれるタスクに継承(適用)されません。

tags7.yml
---
- name: Examples of tag usage
  hosts: web
  become: yes

  tasks:
    - name: Install the httpd package.
      ansible.builtin.include_role:
        name: install-httpd
      when: ansible_facts['os_family'] == "RedHat"
      tags: redhat

    - name: Install the apache2 package.
      ansible.builtin.include_role:
        name: install-apache2
      when: ansible_facts['os_family'] == "Debian"
      tags: debian
install-httpd.yml
- name: Install the latest version of the httpd package
  ansible.builtin.yum:
    name: httpd
    state: latest
  tags: install
- name: Set the server name for Apache
  ansible.builtin.lineinfile:
    path: "/etc/httpd/conf/httpd.conf"
    regexp: "^#ServerName"
    line: "ServerName {{ ansible_facts['fqdn'] }}:80"
    state: present
  tags: config
- name: Syntax check of httpd.conf
  ansible.builtin.command: apachectl configtest
  tags: config 
- name: Restart or start httpd.service
  ansible.builtin.systemd:
    name: httpd.service
    enabled: yes
    state: restarted
  tags: service
- name: Start the firewalld.service
  ansible.builtin.systemd:
    name: firewalld.service
    enabled: yes
    state: started
  tags: firewall
- name: Open a hole in the firewall of the CentOS management node for the http port
  ansible.posix.firewalld:
    service: http
    zone: public
    permanent: yes
    immediate: yes
    state: enabled
  tags: firewall
install-apache2.yml
- name: Install the latest version of the apache2 package
ansible.builtin.apt:
  name: apache2
  state: latest
tags: install
- name: Set the server name for Apache2
ansible.builtin.lineinfile:
  path: "/etc/apache2/apache2.conf"
  insertafter: "^#ServerRoot "
  line: "ServerName {{ ansible_facts['hostname'] }}.exam.local"
  state: present
tags: config
- name: Syntax check of apache2.conf
ansible.builtin.command: apache2ctl configtest 
tags: config
- name: Restart or start apache2.service
ansible.builtin.systemd:
  name: apache2.service
  enabled: yes
  state: restarted
tags: service
- name: Open a hole in the firewall of the Ubuntu management node for the http port
community.general.ufw:
  rule: allow
  port: http
  proto: tcp
  state: enabled
tags: firewall

タグ debian を指定した実行ログです。 ansible.builtin.include_role モジュールを使用したタスクに tags ディレクティブでタグを設定した場合、設定したタグはタスク自体に設定されます。上記のプレイブックで「 roles/install-apache2/tasks/main.yml 」ファイルにタグ debian が設定されたタスクが存在しません。よって、 ansible.builtin.include_role モジュールを設定したタスク Install the apache2 package. を実行しましたが、「 roles/install-apache2/tasks/main.yml 」ファイル内のタスクは 1 つも実行しませんでした。

y_mrok@ctrl:~/code/exam16$ ansible-playbook -i hosts.yml -t debian tags7.yml 

PLAY [Examples of tag usage] *************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************
ok: [takeyamachi]
ok: [marutamachi]
ok: [ebisugawa]
ok: [nijyo]

TASK [Install the apache2 package.] ******************************************************************************************************************
skipping: [marutamachi]
skipping: [takeyamachi]

PLAY RECAP *******************************************************************************************************************************************
ebisugawa                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
marutamachi                : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
nijyo                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
takeyamachi                : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

y_mrok@ctrl:~/code/exam16$ 

演習問題

演習問題はこのリンクをクリックしてください。