Ansible:在角色执行时应用标记

Ansible:在角色执行时应用标记,ansible,ansible-role,Ansible,Ansible Role,我试图明确地理解标记在Ansible中的角色执行中是如何应用的 我在上阅读了文档,并尝试了测试角色: ~/ansible/roles/internal/test/tasks > cat tag-foo.yml --- - import_tasks: tag-foo.yml tags: - foo - foo2 - import_tasks: tag-bar.yml tags: - bar - import_tasks: always.yml tag

我试图明确地理解标记在Ansible中的角色执行中是如何应用的

我在上阅读了文档,并尝试了测试角色

 ~/ansible/roles/internal/test/tasks > cat tag-foo.yml
---
- import_tasks: tag-foo.yml
  tags:
    - foo
    - foo2

- import_tasks: tag-bar.yml
  tags:
    - bar

- import_tasks: always.yml
  tags:
    - always

- import_tasks: never.yml
  tags:
    - never
    - nevermind

 ~/ansible/roles/internal/test/tasks > cat tag-foo.yml
---
- name: This is tag 'foo'
  debug:
    msg: This is tag 'foo'

 ~/ansible/roles/internal/test/tasks > cat tag-bar.yml
---
- name: This is tag 'bar'
  debug:
    msg: This is tag 'bar'

 ~/ansible/roles/internal/test/tasks > cat always.yml
---
- name: This is tag 'always'
  debug:
    msg: This is tag 'always'

 ~/ansible/roles/internal/test/tasks > cat never.yml
---
- name: This is tag 'never'
  debug:
    msg: This is tag 'never'
我创建了一个测试剧本文件:

 ~/ansible > cat plays/test.yml
- hosts: all

  tasks:
    - name: Execute test role with all tags
      import_role:
        name: test
      tags: foo2

    - name: Execute test role with tag 'foo'
      import_role:
        name: test
      tags:
        - foo
我不明白的是,如果我用foo标记执行剧本,那么角色会执行两次,而不是只执行一次
标记foo.yml
标记always.yml

 ~/ansible > ansible-playbook -i test.ini plays/test.yml -l test.domain.local -t foo

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

TASK [Gathering Facts] ********************************************************************************************************************************
ok: [test.domain.local]

TASK [test : This is tag 'foo'] ***********************************************************************************************************************
ok: [test.domain.local] => {
    "msg": "This is tag 'foo'"
}

TASK [test : This is tag 'always'] ********************************************************************************************************************
ok: [test.domain.local] => {
    "msg": "This is tag 'always'"
}

TASK [test : This is tag 'foo'] ***********************************************************************************************************************
ok: [test.domain.local] => {
    "msg": "This is tag 'foo'"
}

TASK [test : This is tag 'bar'] ***********************************************************************************************************************
ok: [test.domain.local] => {
    "msg": "This is tag 'bar'"
}

TASK [test : This is tag 'always'] ********************************************************************************************************************
ok: [test.domain.local] => {
    "msg": "This is tag 'always'"
}

TASK [test : This is tag 'never'] *********************************************************************************************************************
ok: [test.domain.local] => {
    "msg": "This is tag 'never'"
}

PLAY RECAP ********************************************************************************************************************************************
test.domain.local           : ok=7    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
我想要的是从单个
import\u role
语句中强制标记,而不必在
ansible playbook
命令中指定它

Edit:我试图将
import\u role
语句替换为
include\u role
,添加
apply
选项以应用
foo
标记:

- name: Execute test role with tag 'foo'
  include_role:
    name: test
    apply:
      tags:
        - foo
我将角色的
main.yml
文件中的
import\u tasks
语句替换为
include\u tasks

---
- include_tasks: tag-foo.yml
  tags:
    - foo
    - foo2

- include_tasks: tag-bar.yml
  tags:
    - bar

- include_tasks: always.yml
  tags:
    - always

- include_tasks: never.yml
  tags:
    - never
    - nevermind
但不幸的是,没有任何改变:“bar”任务仍在执行:

 ~/ansible > ansible-playbook -i test.ini plays/test.yml -l test.domain.local

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

TASK [Gathering Facts] ********************************************************************************************************************************
ok: [test.domain.local]

TASK [Execute test role with tag 'foo'] ***************************************************************************************************************

TASK [test : include_tasks] ***************************************************************************************************************************
included: /Users/me/ansible/roles/internal/test/tasks/tag-foo.yml for test.domain.local

TASK [test : This is tag 'foo'] ***********************************************************************************************************************
ok: [test.domain.local] => {
    "msg": "This is tag 'foo'"
}

TASK [test : include_tasks] ***************************************************************************************************************************
included: /Users/me/ansible/roles/internal/test/tasks/tag-bar.yml for test.domain.local

TASK [test : This is tag 'bar'] ***********************************************************************************************************************
ok: [test.domain.local] => {
    "msg": "This is tag 'bar'"
}

TASK [test : include_tasks] ***************************************************************************************************************************
included: /Users/me/ansible/roles/internal/test/tasks/always.yml for test.domain.local

TASK [test : This is tag 'always'] ********************************************************************************************************************
ok: [test.domain.local] => {
    "msg": "This is tag 'always'"
}

PLAY RECAP ********************************************************************************************************************************************
test.domain.local           : ok=7    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

通过使用
import\u role
,它是静态重用的,标记不限制导入,而是添加到导入角色的每个任务中

要使用标记来调节角色的执行,您应该对
include\u角色使用动态重用

更多有关导入与导入的文档包括:

标签机制通过CLI设置。 如果要通过剧本定义角色的不同行为,
vars
when
是更好的选择:

-包含\u角色:我的\u角色
变量:
唯福:对
#在我的职位上:
-调试:
msg:只在foo上
时间:只有_foo

如果我用include_角色替换import_角色并添加'apply'参数,则不会发生任何变化:我看到'foo'、'bar'和'always'任务已执行,如果我通过'foo'标记,我希望'bar'不会执行。.你能在问题中添加你尝试过的新剧本吗?谢谢zigarn,我编辑了这个问题!此外,同样的情况也适用于导入任务
vs
包含任务
,因此我无法设置“独立”剧本,我需要在CLI上指定标签。。糟透了!我将记不清错过指定正确标记的次数,整个角色将被执行。。让我们为这些事情做一个不同的角色!