我运行我的剧本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"
}