避免在更多组中多次执行服务器角色?

时间:2016-06-09 14:04:35

标签: ansible

我有六个服务器组,但举例来说,假设我有两个组:dbserverwebserver。我的广告资源如下:

[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收集特定计算机所需的所有角色,删除重复项并然后执行角色。

或者我可以改变剧本的设计吗?

1 个答案:

答案 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