如何在包含/导入的任务中使用标签?

pie*_*cia 2 ansible

有一个示例手册的主要任务:

\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\n
Run Code Online (Sandbox Code Playgroud)\n

include_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\n
Run 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\n
Run 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\n
Run 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"\n
Run Code Online (Sandbox Code Playgroud)\n

如果我取消注释该片段:

\n
args:\n    apply:\n      tags: task\n
Run Code Online (Sandbox Code Playgroud)\n

它仅返回“有效”输出:\xe2\x9d\xaf ansible-playbook playbooks/playground.yml -t task

\n

我想实现:当我使用任务标签时,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}\n
Run Code Online (Sandbox Code Playgroud)\n

在我看来,对于更大的剧本,最好使用:ansible-playbook playbooks/playground.yml -t task,task1而不是ansible-playbook playbooks/playground.yml -t task1. 因为标签task1可以在多个地方使用。

\n

Vla*_*tka 5

结果是设计使然。引用包含的标签继承

如果您向包含添加标签,它们仅适用于包含本身,不适用于包含文件中的任何任务

这解释了“错误用法”

  • -t task该文件已包含,但分别标记为任务 1任务 2 的子任务 3子任务 4不执行。导入的Subtask1Subtask2会执行,因为它们从导入继承了标记任务。

  • -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