我正在管理一个相当复杂的大型网站。我们正在使用ansible进行部署;大多数部署都很好,我们可以将剧本和角色包含在主剧本中,它就像一个魅力。
大师剧本看起来像下面的东西
我们遇到的问题是,我们无法在主要剧本中包含剧本时传递标签。像
这样的东西如果从命令行调用它而不使用master playbok中的标记,这项工作绝对正常
ansible-playbook -i host master_playbook.yml -t t1
对可能的解决方案的任何建议都会有所帮助
答案 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_context
和v2_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
test_role
下面是剧本的输出。
$ 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