使用Ansible管理服务器对

时间:2016-02-29 16:49:16

标签: ansible

我的设置包含"服务器对"在每个"实例"的意义上我的服务包括(通常)不同主机上的两个服务器(比如数据库和Web)。也就是说,我没有多个Web服务器与之通信的单个数据库服务器 - 而是每个Web服务器与其自己的数据库服务器进行通信。我想管理多个这样的配对,但我不知道使用Ansible对配对进行建模的最佳方法。

Ansible中的主要主机组织工具似乎是组和角色。但是,这些只是组合在一起的同类主机。例如,我可以使用它在我的数据库和Web服务器上设置必要的软件。但是,我不认为我可以使用组或角色来告诉每个Web服务器只使用其中一个数据库服务器。

使用Ansible组对一个服务器对进行建模也没什么意义,因为我无法区分这些组中的两个不同角色。

虽然我的设置包含服务器对,但我也有兴趣为n - 到 - m主机关系的多个实例建模(比如说n数据库服务器和{{ 1}} web服务器)。

2 个答案:

答案 0 :(得分:2)

您可以使用ansible变量来提供必要的链接。例如,在您的库存中:

[webservers]
web0 dbserver=db0
web1 dbserver=db1

[dbservers]
db0
db1

现在,在Web服务器上运行任务时,您只需引用dbserver变量即可找到合适的服务器。假设采用标准命名方案,您可以通过使用set_fact模块自动执行此操作。

<强>更新

您无需在两个方向指定链接;你可以用 像这样的东西找到应该有权访问的网络服务器 给定的数据库服务器:

- name: allow access to webserver
  command: >
    iptables -A INPUT
    -s {{hostvars[item].ansible_default_ipv4.address}}
  with_items: "{{groups.webservers}}"
  when: "hostvars[item].dbserver == {{inventory_hostname}}"

答案 1 :(得分:0)

我最终使用以下方法:每对服务器都有自己的组,组变量用于定义哪个服务器在哪个主机上运行:

[test]
test-host

[test:vars]
web_server = test-host
db_server = test-host

[production]
web
db

[production:vars]
web_server = web
db_server = db

然后将Web和数据库服务器的任务分配到不同的角色(web_serverdb_server)。然后,我根据组变量在这些角色之间切换:

- hosts: all
  roles:
     - { role: web_server, when: "web_server == inventory_hostname" }
     - { role: db_server, when: "db_server == inventory_hostname" }

此设置允许我轻松定义角色和对的共享变量,并且它还允许我轻松地仅定位一对(通过--limit)。