Ansible 2.8.1
在我的剧本tasks/
目录中:
main.yml
dev.yml
在main.yml
我有一个这样的块:
- include_tasks: dev.yml
when: ec2_tag_env == 'dev'
它工作正常
但是,如果我尝试使用标签调用 dev.yml 中的特定任务。它不会在运行期间限定任务
例如,这个标记的任务在dev.yml
:
- name: Pull the latest image
docker_image:
name: "{{ dev_image }}"
source: pull
tags:
- container
当我使用它运行剧本时-t container
,它将不符合条件,因为该include_tasks
步骤没有该标签。
添加标签include_tasks
当然可以解决问题,但我需要跟踪标签,因为它们被添加到子任务并在这里添加它们:
- include_tasks: dev.yml
when: ec2_tag_env == 'dev'
tags:
- container
问题
是否有可能让 Ansible 只“知道”
include_tasks
块内有哪些任务并提取适用的标签?实现这一目标的最佳实践是什么?
我宁愿不必做的事情:
- 把一切
main.yml
。我在这本剧本中有很多任务,我真的很想把它们整理成文件。 - 手动标记我的所有
include_tasks
块及其所有子标签。管理听起来像是一场噩梦。
有点老问题,但对于那些可能因为想要或需要使用
include_tasks
而不是import_tasks
. 对于那些可以同时使用的人,我也强烈建议import_tasks
像之前回答的那样使用:在官方Ansible 手册中,开发人员建议在将其他标签应用到包含的任务时
tags: always
在其自身上使用。include_tasks
apply:
请参阅此示例(从手册中复制):
这种方式确保 Ansible 将始终(使用 调用时除外
--skip-tags always
)包含能够查看这些特定标签的外部任务,因此如果使用(不添加)调用 Ansible,将运行install.yml
带有此任务的任务。tags: download
--tags download
install
问:“是否有可能让 Ansible 只‘知道’ include_tasks 块中的任务并提取适用的标签?”
include_task
A:在控制流到达语句并包含文件后,包含任务中的内容将可用。请参阅以下行下的示例。例如,此类标签不会包含在可用标签列表中。请参阅ansible-playbook的选项--list-tags
。在这方面,答案是否定的。但是,如果在include_task的级别上也指定了这样的标签(在控制流到达语句之后),那么这些标签可能是可用的。此外,特殊标签始终使此类标签可用。include_task
问:“实现这一目标的最佳实践是什么?”
答:有两种选择:
要么使用
import_tasks
. 当 playbook 启动时会读取导入。或者,始终使用特殊标签。Ansible 将始终包含文件中的任务。
澄清差异。鉴于下面的文件
按预期工作
使用标签时
-t t1,t2
,执行了t1标签的任务,但是t2标签的任务却没有,因为文件不包含请注意,启动时,应用程序对包含文件中的标签一无所知
启动时,应用程序仍然对包含文件中的标签一无所知,但任务将始终包含在内
-t t1,t2
现在使用标记时,标记为 t1 和 t2 的任务都会执行请注意,在此处启动时,应用程序对应用的标签和包含文件中的标签一无所知
应用标签引起的唯一区别是所有包含的任务都可以由该标签触发,例如
但是,应用的标签不会帮助您单独触发包含的任务。在include_task级别上,如果没有相同的标签或特殊标签always ,应用的标签也毫无意义,这也很好理解。