Ansible:跳过角色中的"always"标签



我有一个剧本,它调用了我编写的多个角色。这个剧本标记了每个角色,这样我就可以单独调用它们,或者从头到尾运行整个过程。在角色中,可以提供额外的标签来分解这些角色中的作品。有些角色任务被标记为"始终",因为我希望它们在角色运行时执行,而不考虑任何特定于角色的标记。

我遇到的问题是,无论是否调用特定于角色的标记,这些"始终"标记都会执行。如果我不调用角色的标记,那么我根本不想执行该角色,包括任何特定于该角色的"始终"任务。

示例:

# 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中的调试发生。

我有一些要求:

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

基本上,我正在寻找一种方法来告诉Ansible,如果我调用"剧本标签",则只执行标签匹配的剧本中的角色;不要在不匹配的角色中执行任何任务,即使它们被标记为"始终"。但是,如果我调用"角色标记",则执行该角色中的所有任务,这些任务要么具有"始终"标记,要么具有我调用的标记。

Ansible有这样的功能吗?如果有帮助的话,我正在使用Ansible 2.0.1.0

请记住,将标记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将不会执行该任务。

对于任何可能出现相同问题的人,解决方案是使用untagged:

playbok.yaml

- name: Preparing gateway node
hosts: "{{ hosts }}"
serial: 1
remote_user: root
any_errors_fatal: true
tasks:
- include_role: 
name: my-role
tags: [ untagged, install, config, my-role-enable-service ]

我的角色/任务/main.yaml

- name: Task 1
debug:
msg: "Run when tags: untagged and config"
tags: [ untagged, config ]
- name: Task 2
debug:
msg: "Run when tags: untagged and install"
tags: [ untagged, install ]
- name: Task 3 
debug:
msg: "Run when tags: my-role-enable-service"
tags: [ untagged, my-role-enable-service ]

运行时:

  1. ansible-playbook playbook.yaml--运行所有任务
  2. ansible-playbook playbook.yaml --tags config--仅运行Task 1
  3. ansible-playbook playbook.yaml --tags install--仅运行Task 2
  4. ansible-playbook playbook.yaml --tags my-role-enable-service--仅运行Task 3

当您拥有all-in-one角色,这些角色结合配置从源代码进行安装或构建时,这会很快变得方便起来。

您可以在安装步骤完成后简单地使用--tags config来加快您的行动手册,而不必每次都等待从源代码构建。

最新更新