【问题标题】:Ansible: Skips "always" tags in rolesAnsible:跳过角色中的“总是”标签
【发布时间】:2016-05-23 18:16:04
【问题描述】:

我有一本剧本,其中调用了我编写的多个角色。这本剧本对每个角色都进行了标记,因此我可以单独调用它们或从头到尾运行整个过程。在角色中,还可以提供额外的标签来分解这些角色中的作品。一些角色任务被标记为“总是”,因为我希望它们在角色运行时执行,而不管任何角色特定的标签。

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

例子:

# 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

【问题讨论】:

  • 你可以试试:ansibile-playbook my-playbook.yml –skip-tags "do_roleA"

标签: ansible ansible-playbook


【解决方案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 将不会执行该任务。

【讨论】:

    【解决方案2】:

    对于任何可能在此页面上遇到相同问题的人 - 解决方案是使用 untagged

    playbook.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 ]
    

    我的角色/tasks/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 来加速您的剧本,而不必每次都等待从源代码构建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多