我的设置包含"服务器对"在每个"实例"的意义上我的服务包括(通常)不同主机上的两个服务器(比如数据库和Web)。也就是说,我没有多个Web服务器与之通信的单个数据库服务器 - 而是每个Web服务器与其自己的数据库服务器进行通信。我想管理多个这样的配对,但我不知道使用Ansible对配对进行建模的最佳方法。
Ansible中的主要主机组织工具似乎是组和角色。但是,这些只是组合在一起的同类主机。例如,我可以使用它在我的数据库和Web服务器上设置必要的软件。但是,我不认为我可以使用组或角色来告诉每个Web服务器只使用其中一个数据库服务器。
使用Ansible组对一个服务器对进行建模也没什么意义,因为我无法区分这些组中的两个不同角色。
虽然我的设置包含服务器对,但我也有兴趣为n
- 到 - m
主机关系的多个实例建模(比如说n
数据库服务器和{{ 1}} web服务器)。
答案 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_server
和db_server
)。然后,我根据组变量在这些角色之间切换:
- hosts: all
roles:
- { role: web_server, when: "web_server == inventory_hostname" }
- { role: db_server, when: "db_server == inventory_hostname" }
此设置允许我轻松定义角色和对的共享变量,并且它还允许我轻松地仅定位一对(通过--limit
)。