在 Ansible 最佳实践页面上:http://docs.ansible.com/ansible/playbooks_best_practices.html#top-level-playbooks-are-separated-by-role它显示了一个示例,其中主 playbook site.yml 包含几个其他顶级 playbook webservers.yml 和 dbservers.yml。在这些剧本中,它们每个都包含共同的角色。一些库存文件我的所有组都在一台主机上运行。另一个 list 文件我每组有一个主机。对于任何组位于一台主机上的情况,如果我运行 site.yml,您会看到共同角色被扮演了两次,一次用于 webservers.yml,一次用于 dbservers.yml。
有什么办法可以避免这种情况?我想你可以从 webservers.yml 和 dbservers.yml 中取出公共(public)角色,而是在 site.yml 中有一个针对公共(public)角色的任务。但是我不能单独配置一个 webserver 或 dbserver 。
最佳答案
和其他人一样,我也有这个问题,即使角色是幂等的,执行也需要时间,所以我们可能只想执行一次。
我使用了与 @Vor 类似的方法但我选择facts而不是创建文件。
提醒:
Facts survive between plays during an Ansible run, but will not be saved across executions even if you use a fact cache.
例子
site.yml
---
- hosts: all
roles: [common]
- include: db.yml
- include: web.yml
db.yml
---
- hosts: db
roles:
- { role: common, when: isdef_common_role is not defined }
- db
web.yml
---
- hosts: web
roles:
- { role: common, when: isdef_common_role is not defined }
- web
roles/common/tasks/main.yml
---
- debug: 'msg="{{ inventory_hostname }} common"'
- set_fact: isdef_common_role=1
这确实有点多余(因为您必须每次都进行条件包含),但具有以下优点:
ansible-playbook site.yml
,ansible-playbook site.yml -l common
,ansible-playbook site.yml -l db
,ansible-playbook db.yml
,...)如果不想重复
{ role: common, when: isdef_common_role is not defined }
,您可以使用以下命令将条件放入 common 角色中:site.yml
: 没有变化db.yml
, web.yml
:从角色中删除条件roles/common/tasks/main.yml
---
- include: tasks.yml
when: isdef_common_role is not defined
- set_fact: isdef_common_role=1
roles/common/tasks/tasks.yml
---
- debug: 'msg="{{ inventory_hostname }} common"'
关于Ansible 最佳实践不重复常见角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32783852/