2016-02-29 81 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

感謝您的更新。我結束了使用不同的方法(請參閱我的答案),但我很感激您的輸入! –