Ansible:跳过"总是"角色中的标签

时间:2016-05-23 18:16:04

标签: ansible ansible-playbook

我有一个调用我写过的多个角色的剧本。这个剧本标记了每个角色,因此我可以单独调用它们,也可以从头到尾运行整个过程。在角色内,可以提供附加标签以在这些中分解作品。一些角色任务用"始终"标记。因为我希望它们在角色运行时执行,而不管任何角色特定的标记。

我遇到的问题是这些"总是"标签执行是否调用特定于角色的标记。如果我没有为某个角色调用该标记,我根本不想让角色执行,包括任何"始终"特定于该角色的任务。

示例:

# Playbook
- hosts: localhost
  roles:
    - role: roleA
      tags: do_roleA

    - role: roleB
      tags: do_roleB


# Role A: 
- name: Always do this when doing role A
  debug: msg="test"
  tags: always

- name: Task1
  debug: msg="task1"
  tags: do_task1

- name: Task2
  debug: msg="task2"
  tags: do_task2 

示例电话:

ansibile-playbook my-playbook.yml --tags "do_roleB"

但这会导致角色A中的调试也发生。

我有一些要求:

  • 不能跳过"总是"因为roleB可能有一些需要它的任务。
  • 不希望始终更改标记,并为每个子任务添加标记列表。即[do_task1,do_task2],因为标签的数量会变大并且很容易忘记添加一个。

基本上我正在寻找一种方法来告诉Ansible,如果我打电话给#34;剧本标签"仅执行标记匹配的playbook中的角色;不执行不匹配的角色中的任何任务,即使它们被标记为"始终"。但是如果我打电话给#34;角色标签"执行该角色中的所有任务,这些任务的标记为"始终"或者我打电话的标签。

Ansible有这样的功能吗?如果它有助于我使用Ansible 2.0.1.0

1 个答案:

答案 0 :(得分:1)

请注意,将标记do_roleA应用于角色会将 do_roleA标记添加到该角色的每个任务中。
所以你的示例角色实际上变成了:

# Role A:
- name: Always do this when doing role A
  debug: msg="test"
  tags:
    - always
    - do_roleA

- name: Task1
  debug: msg="task1"
  tags:
    - do_task1
    - do_roleA

- name: Task2
  debug: msg="task2"
  tags:
    - do_task2
    - do_roleA

您可以从该任务中删除always代码,因此在使用do_roleA标记角色后,它将是该任务的唯一标记。
因此,使用-t do_roleB调用playbook将不会执行该任务。