Skip to content

Instantly share code, notes, and snippets.

@rkrzr
Last active August 12, 2025 21:23
Show Gist options
  • Select an option

  • Save rkrzr/f5387167fa7b4869e2dca8b713879562 to your computer and use it in GitHub Desktop.

Select an option

Save rkrzr/f5387167fa7b4869e2dca8b713879562 to your computer and use it in GitHub Desktop.

Revisions

  1. rkrzr revised this gist Dec 6, 2017. 1 changed file with 5 additions and 11 deletions.
    16 changes: 5 additions & 11 deletions auto_tags.py
    Original file line number Diff line number Diff line change
    @@ -32,23 +32,17 @@ class CallbackModule(CallbackBase):
    def v2_playbook_on_start(self, playbook):
    """
    Dynamically add a tag of the same name to each role.
    Note: Plays, roles, task_blocks and tasks can have tags.
    """
    # Plays, tasks and task_blocks can have tags: play.tags, task.tags, task_block.tags
    plays = playbook.get_plays()

    # Note: Although identical roles are shared between plays we cannot deduplicate them,
    # since Ansible treats them as different objects internally
    roles = [role for play in plays for role in play.get_roles()]

    # Each role can have zero or more task blocks
    # For each task block we assign a tag that has the same name as the role it belongs to
    # Note: Tags for roles are set dynamically in `_load_role_data` instead of in __init__
    # I don't know why they do that.
    for role in roles:
    role_name = role._role_name
    task_blocks = role.get_task_blocks()

    for task_block in task_blocks:
    if role_name not in task_block.tags:
    print('Assigning dynamic tag: {}'.format(role_name))
    task_block.tags += [role_name]
    else:
    print('Warning: Not assigning duplicate tag: {}'.format(role_name))
    if role_name not in role.tags:
    role.tags += [role_name]
  2. rkrzr created this gist Nov 17, 2017.
    54 changes: 54 additions & 0 deletions auto_tags.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,54 @@
    """
    This module implements an Ansible plugin that is triggered at the start of a playbook.
    The plugin dynamically generates a tag for each role. Each tag has the same name as its role.
    The advantage of this is that it saves you some boilerplate, because you don't have to wrap
    all tasks of a role in an additional block and assign a tag to that.
    Additionally, it works automatically when you add new roles to your playbook.
    Usage is exactly the same as without this plugin:
    ansible-playbook --tags=some_tag provision.yml
    Here, the "some_tag" tag was generated dynamically (assuming there is a "some_tag" role).
    Installation:
    1. Place this file in `plugins/callbacks/auto_tags.py` (relative to your playbook root)
    2. Add the following two lines to your `ansible.cfg` file:
    callback_plugins = plugins/callbacks
    callback_whitelist = auto_tags
    """
    from __future__ import print_function
    from ansible.plugins.callback import CallbackBase


    class CallbackModule(CallbackBase):
    """
    Ansible supports several types of plugins. We are using the *callback* type here, since
    it seemed the best choice for our use case, because it allows you to hook into the start
    of a playbook.
    """
    def v2_playbook_on_start(self, playbook):
    """
    Dynamically add a tag of the same name to each role.
    """
    # Plays, tasks and task_blocks can have tags: play.tags, task.tags, task_block.tags
    plays = playbook.get_plays()

    # Note: Although identical roles are shared between plays we cannot deduplicate them,
    # since Ansible treats them as different objects internally
    roles = [role for play in plays for role in play.get_roles()]

    # Each role can have zero or more task blocks
    # For each task block we assign a tag that has the same name as the role it belongs to
    for role in roles:
    role_name = role._role_name
    task_blocks = role.get_task_blocks()

    for task_block in task_blocks:
    if role_name not in task_block.tags:
    print('Assigning dynamic tag: {}'.format(role_name))
    task_block.tags += [role_name]
    else:
    print('Warning: Not assigning duplicate tag: {}'.format(role_name))