有一个示例手册的主要任务:
\n---\n- name: Include tasks\n include_tasks: include_task.yml\n # args:\n # apply:\n # tags: task\n tags: task\n\n- name: Import tasks\n import_tasks: import_task.yml\n tags: task\n\n- name: Main task\n debug:\n msg: The main task\n tags: main\nRun Code Online (Sandbox Code Playgroud)\ninclude_task.yml:
\n---\n- name: Subtask3\n debug:\n msg: Subtask3 include\n tags: task1\n\n- name: Subtask4\n debug:\n msg: Subtask4 include\n tags: task2\nRun Code Online (Sandbox Code Playgroud)\n导入_task.yml:
\n---\n- name: Subtask1\n debug:\n msg: Subtask1 import\n tags: task1\n\n- name: Subtask2\n debug:\n msg: Subtask2 import\n tags: task2\nRun Code Online (Sandbox Code Playgroud)\n一些预期用途的示例:
\n\xe2\x9d\xaf ansible-playbook playbooks/playground.yml\nlocalhost | SUCCESS => {\n "changed": false,\n "include": "include_task.yml",\n "include_args": {}\n}\nlocalhost | SUCCESS => {\n "msg": "Subtask3 include"\n}\nlocalhost | SUCCESS => {\n "msg": "Subtask4 include"\n}\nlocalhost | SUCCESS => {\n "msg": "Subtask1 import"\n}\nlocalhost | SUCCESS => {\n "msg": "Subtask2 import"\n}\nlocalhost | SUCCESS => {\n "msg": "The main task"\n}\n\n\xe2\x9d\xaf ansible-playbook playbooks/playground.yml -t main\nlocalhost | SUCCESS => {\n "msg": "The main task"\n}\n\nRun Code Online (Sandbox Code Playgroud)\n以及一些错误用法的例子:
\n\xe2\x9d\xaf ansible-playbook playbooks/playground.yml -t task\nlocalhost | SUCCESS => {\n "changed": false,\n "include": "include_task.yml",\n "include_args": {}\n}\nlocalhost | SUCCESS => {\n "msg": "Subtask1 import"\n}\nlocalhost | SUCCESS => {\n "msg": "Subtask2 import"\n}\n\n\xe2\x9d\xaf ansible-playbook playbooks/playground.yml -t task,task1\nlocalhost | SUCCESS => {\n "changed": false,\n "include": "include_task.yml",\n "include_args": {}\n}\nlocalhost | SUCCESS => {\n "msg": "Subtask3 include"\n}\nlocalhost | SUCCESS => {\n "msg": "Subtask1 import"\n}\nlocalhost | SUCCESS => {\n "msg": "Subtask2 import"\n\n\xe2\x9d\xaf ansible-playbook playbooks/playground.yml -t task,task2\nlocalhost | SUCCESS => {\n "changed": false,\n "include": "include_task.yml",\n "include_args": {}\n}\nlocalhost | SUCCESS => {\n "msg": "Subtask4 include"\n}\nlocalhost | SUCCESS => {\n "msg": "Subtask1 import"\n}\nlocalhost | SUCCESS => {\n "msg": "Subtask2 import"\nRun Code Online (Sandbox Code Playgroud)\n如果我取消注释该片段:
\nargs:\n apply:\n tags: task\nRun Code Online (Sandbox Code Playgroud)\n它仅返回“有效”输出:\xe2\x9d\xaf ansible-playbook playbooks/playground.yml -t task
我想实现:当我使用任务标签时,include_task.yml 或/和 import_task.yml 中的两个任务都会被执行。 \n当我使用任务时,task1标签只会执行第一个子任务。任务、task2标签的情况也类似。
\n通常我只在 main.yml 文件中使用标签。但有时我需要更大的颗粒度,所以我想在包含/导入的任务中使用额外的标签。\n这可能吗?
\n我不确定这是否是 import_tasks 嵌套标签的正确使用:
\n\xe2\x9d\xaf ansible-playbook playbooks/playground.yml -t task2\nlocalhost | SUCCESS => {\n "msg": "Subtask2 import"\n}\n\n\xe2\x9d\xaf ansible-playbook playbooks/playground.yml -t task1\nlocalhost | SUCCESS => {\n "msg": "Subtask1 import"\n}\nRun Code Online (Sandbox Code Playgroud)\n在我看来,对于更大的剧本,最好使用:ansible-playbook playbooks/playground.yml -t task,task1而不是ansible-playbook playbooks/playground.yml -t task1. 因为标签task1可以在多个地方使用。
结果是设计使然。引用包含的标签继承:
如果您向包含添加标签,它们仅适用于包含本身,不适用于包含文件中的任何任务
这解释了“错误用法”
-t task该文件已包含,但分别标记为任务 1和任务 2 的子任务 3和子任务 4不执行。导入的Subtask1和Subtask2会执行,因为它们从导入继承了标记任务。
-t task,task1 子任务 3执行,因为任务 1适用。子任务 1和子任务 2执行,因为任务适用
-t task,task2与上面相同,但执行Subtask4而不是Subtask3
下面的片段将标签任务应用于包含的任务。这解释了“有效”结果。
args:
apply:
tags: task
Run Code Online (Sandbox Code Playgroud)
以下任务可以解决问题。文件include_task.yml将始终被包含,并且标记任务将应用于包含的任务
- include_tasks: include_task.yml
args:
apply:
tags: task
tags: always
- import_tasks: import_task.yml
tags: task
Run Code Online (Sandbox Code Playgroud)
请参阅下面的缩略结果
shell> ansible-playbook pb.yml | grep msg:
msg: Subtask3 include
msg: Subtask4 include
msg: Subtask1 import
msg: Subtask2 import
Run Code Online (Sandbox Code Playgroud)
shell> ansible-playbook pb.yml -t task | grep msg:
msg: Subtask3 include
msg: Subtask4 include
msg: Subtask1 import
msg: Subtask2 import
Run Code Online (Sandbox Code Playgroud)
shell> ansible-playbook pb.yml -t task1 | grep msg:
msg: Subtask3 include
msg: Subtask1 import
Run Code Online (Sandbox Code Playgroud)
shell> ansible-playbook pb.yml -t task2 | grep msg:
msg: Subtask4 include
msg: Subtask2 import
Run Code Online (Sandbox Code Playgroud)
与 相比,您不能期望-t task,task1或-t task,task2受到更多限制-t task。
| 归档时间: |
|
| 查看次数: |
4801 次 |
| 最近记录: |