Ansible最佳实践不重复共同的作用

use*_*973 12 roles organization ansible ansible-playbook

在Ansible最佳实践页面上:http://docs.ansible.com/ansible/playbooks_best_practices.html#top-level-playbooks-are-separated-by-role 它显示了一个示例,其中主要playbook site.yml包含一对其他顶级剧本webservers.yml和dbservers.yml.在这些剧本中,他们每个人都有共同的角色.我将所有组的一些库存文件在一台主机上运行.另一个库存文件我每个组都有一个主机.对于组中一个主机的情况,如果我运行site.yml,您可以看到共同角色被播放两次,一个用于webservers.yml,另一个用于dbservers.yml.

什么是避免这种情况的解决方案?我想你可以从webservers.yml和dbservers.yml中取出共同的角色,而在site.yml中有一个任务,它既针对公共角色,也针对公共角色.但后来我不能单独配置一个常见的网络服务器或数据库服务器.

Bri*_*ght 7

我使用meta我的角色目录中的文件确定角色依赖项.角色依赖性允许您在使用角色时自动引入其他角色.角色依赖关系存储在角色目录中包含的meta/main.yml文件中.

角色依赖项始终在包含它们的角色之前执行,并且是递归的.默认情况下,角色也只能作为依赖项添加一次 - 如果另一个角色也将其列为依赖项,则不会再次运行.可以通过向meta/main.yml文件添加allow_duplicates:yes来覆盖此行为.

请参阅Ansible文档中的示例.

  • 我喜欢这种方法,似乎对我来说最有意义。但是,当我实际尝试实现它时,它不起作用。我的共同角色仍然运行多次。我明确尝试设置 allow_duplicates: no 没有效果。好像还有其他人有同样的问题?https://github.com/ansible/ansible/issues/5971 (2认同)

Pet*_*ons 2

我的方法是不在剧本中包含剧本。至少这样做会导致角色在单个作业中执行多次。

我需要包含在多个剧本中的任何内容都会转换为一个角色,并且该角色可以包含在许多剧本中。如果我最终得到了包含一系列重复角色的多个剧本,我可以将这些角色组合成一个角色,该角色仅依赖于其他角色以避免重复。