Ansible应用来自剧本(而不是命令行)的标签



我运行我的剧本a.yaml,并且在a.yaml中,我希望包含b.yaml中的一个或多个任务
首先,我尝试在a.yaml上放置以下内容:

import_playbook: b.yaml --tags "tag1"

但这错误地表明--tags不适用于import_playbook。根据最新的Ansibleinclude_tasks文档,我尝试了以下内容:a.yaml:

- include_tasks:
file: b.yaml
apply:
tags: tag1

b.yaml:

- shell: echo $HOSTNAME
register: hostname
tags: tag1
- debug:
msg: "task2"
tags: tag2

但是b.yaml中的两个任务都被调用了,尽管我只期望第一个任务如标记所示。

问题:

  • 如何将标签从a.yaml传递到b.yaml并获得识别?如果include_tasks不是解决方案,我不介意使用其他东西
  • 如何将结果(主机名或任何结果(从b.yaml传递回调用方a.yaml

遗憾的是,你试图做的是不可能的
只能在cli上指定要执行的标记。

apply没有指定要包含哪些标记,而是将该标记应用于包含文件中的每个任务。这意味着它添加了标签,就像您在b.yaml中将tags: tag1添加到所有任务中一样。

如果只想包含文件中的某些任务,则它们需要在该文件中具有该标记,然后可以在cli上使用--tags "tag1"
我建议您不要过度地这样做,因为以后阅读代码的人(包括您(很难知道实际会发生什么。

Meta:请在Stackoverflow上每篇帖子只问一个问题

我不明白你的第二个问题。如果包含来自不同文件的任务,它们的执行方式与直接在那里执行的方式相同,因此不需要传递任何内容。你可以直接访问它。

例如:

main.yml:

- hosts: localhost
tasks:
- include_tasks:
file: i.yml
- debug:
msg: "{{ tvar.stdout }}"

i.yml:

- shell: date -u
register: tvar

结果:

TASK [include_tasks] **********************************************************************************
included: /home/.../test/i.yml for localhost
TASK [shell] **********************************************************************************
changed: [localhost]
TASK [debug] **********************************************************************************
ok: [localhost] => {
"msg": "ons 14 apr 2021 05:34:25 UTC"
}

最新更新