Ansible:在角色执行时应用标记
我试图明确地理解标记在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/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上指定标签。。糟透了!我将记不清错过指定正确标记的次数,整个角色将被执行。。让我们为这些事情做一个不同的角色!