2016-02-29 83 views
0

我的设置包含“服务器对”,这意味着我的服务的每个“实例”都由(通常)不同主机上的两台服务器(如数据库和Web)组成。也就是说,我没有一个数据库服务器可以与许多Web服务器进行通信 - 相反,每个Web服务器都会与自己的数据库服务器通信。我想管理多个这样的对,但我不知道使用Ansible对这些对进行建模的最佳方法。使用Ansible管理服务器对

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

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

虽然我的设置由服务器对我也很有兴趣建模n至 - m主机关系的多个实例(比如n数据库服务器和m Web服务器)的总称。

回答

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)。

2

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

[webservers] 
web0 dbserver=db0 
web1 dbserver=db1 

[dbservers] 
db0 
db1 

现在,在您的网页服务器上运行的任务时,你可以简单地参考dbserver变量来找到相应的服务器。假设一个标准的命名方案,您可以通过使用set_fact模块自动执行此操作。

更新

你并不需要指定两个方向的链接;你可以使用 像这样找应该有机会获得 一个给定的数据库服务器的Web服务器:

- 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}}" 
+0

这有效,但相当麻烦:首先,我需要两个方向的信息(例如允许从数据库服务器上的Web服务器进行远程访问),所以我需要为每个数据库添加'webserver = ...'服务器,这是冗余信息,使维护变得更加困难。其次,在Web和数据库服务器(例如数据库用户名)之间共享变量没有很好的方法,因为变量是全局,每个组或每次播放定义的。 –

+0

我想你可以通过使用'hostvars'来找到合适的网络服务器来避免重复信息,而不必在清单中明确记录这些信息(例如,搜索具有'dbserver = <此数据库服务器>的网络服务器)。您可以绝对地共享数据库用户名等信息,方法是将其声明为通用角色,并将其包含在您需要该信息的任何播放中。 – larsks

+0

感谢您的更新。我结束了使用不同的方法(请参阅我的答案),但我很感激您的输入! –