At work the Ansible repo that I work with is not as organized as I’d like. I’d like to make sure that the one that I am starting to commit to in my Lab is not going to end up in the same state. In order to help keep it tidy I figured it would be a good idea to separate out some of the tasks that I have in the roles I am working on. Then I could call import_tasks on them in the main.yml with some conditionals. This would also allow me to resuse groups of tasks from one role in another. I started out with something like this:

tasks/tasks_b.yml
---
- name: tasks_b - 1
  tags: [never, tags_b]
  debug:
    msg: This is a test from the tasks_b tasks
tasks/tasks_a.yml
---
- name: tasks_a - 1
  tags: [never, tags_a]
  debug:
    msg: This is a test from the tasks_a tasks
tasks/main.yml
---
- include_tasks: "{{ role_path }}/tasks/tasks_a.yml"
  tags: [never, tags_a]

- include_tasks: "{{ role_path }}/tasks/tasks_b.yml"
  tags: [never, tags_b]

I was attempting to use the never reserved tag to make sure that a task was only executed when I specifically included the tag. I guess I misunderstood the documentation because the way I found that it works is that when you specify the never tag on a task it will only execute when you include any tag. So with the setup about and running:

ansible-playbook -i hosts playbooks/testing.yml -l worker1 -t tags_a

I would get the following output:

PLAY [all] *********************************************************************************************************************************************************************************************************

TASK [testing : include_tasks] *************************************************************************************************************************************************************************************
included: /home/ramon/code/Lab/ansible/playbooks/roles/testing/tasks/tasks_a.yml for worker1

TASK [testing : tasks_a - 1] ***************************************************************************************************************************************************************************************
ok: [worker1] => {
    "msg": "This is a test from the tasks_a tasks"
}

TASK [testing : include_tasks] *************************************************************************************************************************************************************************************
included: /home/ramon/code/Lab/ansible/playbooks/roles/testing/tasks/tasks_b.yml for worker1

TASK [testing : tasks_b - 1] ***************************************************************************************************************************************************************************************
ok: [worker1] => {
    "msg": "This is a test from the tasks_b tasks"
}

PLAY RECAP *********************************************************************************************************************************************************************************************************
worker1                    : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

So even though I only included tags_a in the command I got the exection of both tasks with the never tag.

I couldn’t really find a workaround that seems correct so I ended up adding my own conditional to the import_tasks tasks to check the tags:

---
- import_tasks: "{{ role_path }}/tasks/tasks_a.yml"
  when: '"tags_a" in ansible_run_tags'

- import_tasks: "{{ role_path }}/tasks/tasks_b.yml"
  when: '"tags_b" in ansible_run_tags'

Now when I run the playbook with just the tags_a tag I only get those tasks and likewise for tags_b. Additionally when I don’t include any tags all both are skipped:

$ ansible-playbook playbooks/testing.yml -i hosts -l worker1 -t tags_a

PLAY [all] ******************************************************************************************************************************************************************************************************

TASK [testing : tasks_a - 1] ************************************************************************************************************************************************************************************
ok: [worker1] => {
    "msg": "This is a test from the tasks_a tasks"
}

TASK [testing : tasks_b - 1] ************************************************************************************************************************************************************************************
skipping: [worker1]

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

$ ansible-playbook playbooks/testing.yml -i hosts -l worker1 -t tags_b

PLAY [all] ******************************************************************************************************************************************************************************************************

TASK [testing : tasks_b - 1] ************************************************************************************************************************************************************************************
ok: [worker1] => {
    "msg": "This is a test from the tasks_b tasks"
}

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

$ ansible-playbook playbooks/testing.yml -i hosts -l worker1

PLAY [all] ******************************************************************************************************************************************************************************************************
TASK [testing : tasks_a - 1] ************************************************************************************************************************************************************************************
skipping: [worker1]


TASK [testing : tasks_b - 1] ************************************************************************************************************************************************************************************
skipping: [worker1]

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

I have commited this testing role to my Lab if you are interesting it adding something like that for you own test or just want to copy this: