Ansible根据包含的剧本和角色中的标签限制任务

时间:2018-03-22 15:31:40

标签: tags include ansible

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

大师剧本看起来像下面的东西

  • Master PlayBook
    • 包括具有特定于部署最新版本的vars / config的部署playbook
    • 部署手册包括与SW相关的特定角色
      • 角色具有适当标记的任务

我们遇到的问题是,我们无法在主要剧本中包含剧本时传递标签。像

这样的东西
  • 包括:task1.yml 标签:t1

如果从命令行调用它而不使用master playbok中的标记,这项工作绝对正常

ansible-playbook -i host master_playbook.yml -t t1

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

2 个答案:

答案 0 :(得分:1)

这不是一件容易实现的事情。

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

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

并使用此

- include_role:
    name: myrole
    tasks_from: job1.yml

仅包含job1个任务。

很难:你可以制作一个回调插件,它可以动态修改执行上下文,从set_play_contextv2_playbook_on_play_start处理程序的组合中获取变量所需的标记。有一篇关于这个here的帖子,但它是用俄语写的。

答案 1 :(得分:1)

回答康斯坦丁(Konstantin)有关为什么要这样做的问题;最佳做法是包括不同的任务文件,并将它们包含在main.yml中。在一个任务文件中,您可以有两个以上的任务,尽管您可以/应该标记每个任务,但在很强的情况下,您希望运行文件中的所有任务,而不仅仅是该文件中的一个任务。能够标记任务包含文件提供了粒度,以便能够运行/测试您的剧本。

$ ansible-playbook -u a_user -i目录/ts_host.yml playbook-test.yml -t test:template_file

playbook-test.yml

  • 主机:crash_n_burn_poc 角色:
    • test_role

test_role

main.yml

用于测试的任务文件

  • 包括:copy_test_file.yml
    标签:[“ test”,“ test:copy_file”]
  • 包括:template_test_file.yml 标签:[“ test”,“ test:template_file”]

下面是剧本的输出。

$ ansible-playbook -u a_user -i目录/ts_host.yml playbook-test.yml -t test:template_file

PLAY [crash_n_burn_poc] *********************************************** ****************************************************** *********************

任务[聚会事实] ********************************************** ****************************************************** *********************** 好的:[linuxdev.nut]

任务[test_role:模板] ********************************************* ****************************************************** ******************* 更改为:[linuxdev.nut]

PLAY RECAP ********************************************* ****************************************************** ************************************ linuxdev.nut:ok = 2更改= 1不可达= 0失败= 0