Tags Ansible基于包含的剧本和角色中的标记限制任务

Tags Ansible基于包含的剧本和角色中的标记限制任务,tags,include,ansible,Tags,Include,Ansible,我管理一个相当大的网站相当复杂。我们正在使用ansible进行部署;大多数部署都很好,我们可以在主剧本中包含剧本和角色,它就像一个魅力 大师级剧本如下所示 大师剧本 包括部署手册,其中包含特定于部署最新版本的vars/config 部署手册包括与软件相关的特定角色 角色具有适当标记的任务 我们面临的问题是,我们不能在主剧本中包含剧本的同时传递标签。差不多 包括:task1.yml 标签:t1 如果从命令行调用它,而不使用master playbok中的标记,那么这项工作绝对正常

我管理一个相当大的网站相当复杂。我们正在使用ansible进行部署;大多数部署都很好,我们可以在主剧本中包含剧本和角色,它就像一个魅力

大师级剧本如下所示

  • 大师剧本
    • 包括部署手册,其中包含特定于部署最新版本的vars/config
    • 部署手册包括与软件相关的特定角色
      • 角色具有适当标记的任务
我们面临的问题是,我们不能在主剧本中包含剧本的同时传递标签。差不多

  • 包括:task1.yml 标签:t1
如果从命令行调用它,而不使用master playbok中的标记,那么这项工作绝对正常

ansible playbook-我主持master_playbook.yml-t t1


任何可能的解决方案的建议都会有帮助

这不是一件容易做到的事情

简单方法:您可以重构角色,使其具有单独的任务文件,如:

tasks/main.yml (that import job1 and job2)
tasks/job1.yml
tasks/job2.yml
用这个

- include_role:
    name: myrole
    tasks_from: job1.yml
只包含
job1
任务


艰难的方法:您可以创建一个回调插件,通过组合
set\u play\u context
v2\u playbook\u on\u play\u start
处理程序,动态修改执行上下文,从变量中获取所需的标记。有一篇关于这一点的帖子,但它是用俄语写的。

回答康斯坦丁的问题,你为什么要这样做;最好的做法是将不同的任务文件包括在main.yml中。在一个任务文件中,您可以有两个以上的任务,尽管您可以/应该标记每个任务,但很有可能您希望在一个文件中运行所有任务,而不仅仅是该文件中的一个任务。能够标记任务包含文件提供了运行/测试playbook的粒度

$ansible playbook-u a_user-i inventory/ts_host.yml playbook-test.yml-t test:模板文件

playbook-test.yml
  • 主持人:crash\n\u burn\u poc 角色:
    • 测试角色
测试角色

main.yml 用于测试的任务文件
  • 包括:复制测试文件.yml
    标签:[“测试”,“测试:复制_文件”]
  • 包括:template_test_file.yml 标签:[“测试”,“测试:模板文件”]
下面是剧本的输出

$ansible playbook-u a_user-i inventory/ts_host.yml playbook-test.yml-t test:模板文件

玩[撞车,烧车]******************************************************************************************************************

任务[收集事实]******************************************************************************************************************* ok:[linuxdev.nut]

任务[测试角色:模板]************************************************************************************************************** 更改:[linuxdev.nut]

重演*******************************************************************************************************************************
linuxdev.nut:ok=2 changed=1 unreachable=0 failed=0

为什么要这样做?特定的部署只需要使用多个角色中的两个任务,这些任务是从部署手册中调用的,传递不同的参数,因此,我们不需要运行整个角色,只需要传递标签来限制我们只需要的任务。这是一种可能性,但这种方法需要对现有代码进行大量的重新工作。我可能会继续使用脚本,并通过命令行直接使用标记调用剧本