我有六个服务器组,但举例来说,假设我有两个组:dbserver
和webserver
。我的广告资源如下:
[dbserver]
db.com
both.com
[webserver]
web.com
both.com
我的剧本看起来像这样:
---
- hosts: dbserver
roles:
- { role: commonrole }
- { role: dbrole }
- hosts: webserver
roles:
- { role: commonrole }
- { role: webrole }
但是,当我为服务器both.com
运行playbook时,commonrole
会被执行两次!
在这个简单的例子中,我当然可以将commonrole
放在一个共同的组中:
- hosts: all
roles:
- { role: commonrole }
或创建
- hosts: db_and_web_server
roles:
- { role: commonrole }
- { role: dbrole }
- { role: webrole }
但对于六个组,我最多会得到63个组合。
我希望ansible收集特定计算机所需的所有角色,删除重复项并然后执行角色。
或者我可以改变剧本的设计吗?
答案 0 :(得分:0)
您可以在共同角色中使用set_fact
行动
主题的事实被缓存在剧本中的每个剧本中
例如,您的常见角色main.yaml可能如下所示:
---
- include: common.yml
when: common_has_run is not defined
- set_fact: common_has_run=true
when: common_has_run is not defined
common.yml包含共同角色的所有任务 找到了这个技巧here。