对剧本中的角色标记是否正常工作感到困惑,如果是,那么背后的哲学。
剧本
- hosts: Test-c7-1
roles:
- role: test.tag
tags: tag2
Run Code Online (Sandbox Code Playgroud)
角色/任务
---
- debug:
msg: "task - tag1 set"
tags: tag1
- debug:
msg: "task - tag2 set"
tags: tag2
- debug:
msg: "task - always set"
tags: always
- debug:
msg: "task - NO TAG"
Run Code Online (Sandbox Code Playgroud)
当传入匹配的标签时,角色就会运行,任务列表中的所有内容都会执行,而不管标签如何。
匹配标签:
ansible-playbook playbook/tagtester.yml --tags "tag2"
PLAY [Test-c7-1] ********************************************************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************************************************
ok: [Test-c7-1]
TASK [test.tag : debug] *************************************************************************************************************************************************************
ok: [Test-c7-1] => {
"msg": "task - tag1 set"
}
TASK [test.tag : debug] *************************************************************************************************************************************************************
ok: [Test-c7-1] => {
"msg": "task - tag2 set"
}
TASK [test.tag : debug] *************************************************************************************************************************************************************
ok: [Test-c7-1] => {
"msg": "task - always set"
}
TASK [test.tag : debug] *************************************************************************************************************************************************************
ok: [Test-c7-1] => {
"msg": "task - NO TAG"
}
PLAY RECAP **************************************************************************************************************************************************************************
Test-c7-1 : ok=5 changed=0 unreachable=0 failed=0
Run Code Online (Sandbox Code Playgroud)
当传递不匹配的标签时,角色仍然运行,但(不匹配的)标签被传递给任务,并且只有带有该标签(或标记为“总是”)的任务才会被执行。
不匹配的标签:
ansible-playbook playbook/tagtester.yml --tags "tag1"
PLAY [Test-c7-1] ********************************************************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************************************************
ok: [Test-c7-1]
TASK [test.tag : debug] *************************************************************************************************************************************************************
ok: [Test-c7-1] => {
"msg": "task - tag1 set"
}
TASK [test.tag : debug] *************************************************************************************************************************************************************
ok: [Test-c7-1] => {
"msg": "task - always set"
}
PLAY RECAP **************************************************************************************************************************************************************************
Test-c7-1 : ok=3 changed=0 unreachable=0 failed=0
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?
并且,有没有办法在剧本中标记角色(以及任务 - include_role)以仅根据执行时传入的标记过滤该角色本身是否被执行?
这是预期的行为吗?
是的。
并且,有没有办法在剧本中标记角色(以及任务 - include_role)以仅根据执行时传入的标记过滤该角色本身是否被执行?
从 Ansible 2.4 版本开始,有三种使用角色的方式:
使用import_role和roles声明,Ansible 连接声明中指定的标签并执行任务。
include_role 就像一个独立的任务一样工作,即它自己观察标签。
笔记
- 同样的规则适用于when条件。
- 在 Ansible 2.4 之前include_role像import_role现在一样工作。
- 参考静态和动态之间的差异