![多重資料中心 Ansible 負載平衡器模板](https://rvso.com/image/658734/%E5%A4%9A%E9%87%8D%E8%B3%87%E6%96%99%E4%B8%AD%E5%BF%83%20Ansible%20%E8%B2%A0%E8%BC%89%E5%B9%B3%E8%A1%A1%E5%99%A8%E6%A8%A1%E6%9D%BF.png)
我正在將現有多資料中心設定的管理遷移到 Ansible,但我不確定建模它的最佳方法是什麼,因為我是新手。
我有三個資料中心 D1、D2 和 D3。在每個中,相同的配置都以相同的方式重複:
- 一個nginx 負載平衡器(lb.D[n]) 綁定到公用 IP
- 二應用程式伺服器(as[1-2].D[n]) 僅從本地負載平衡器接收流量
- 從屬(唯讀)資料庫伺服器(db.D[n]) 兩個應用程式伺服器都從中讀取。
到目前為止我製作的主機檔案看起來像這樣:
# DC1 -----------
[dc_1_webservers]
10.43.0.10
[dc_1_appservers]
10.43.0.20
10.43.0.21
[dc_1_dbservers]
10.43.0.30
[dc_1:children]
dc_1_webservers
dc_1_appservers
dc_1_dbservers
# DC2 -----------
[dc_2_webservers]
10.43.10.10
[dc_2_appservers]
10.43.10.20
10.43.10.21
[dc_2_dbservers]
10.43.10.30
[dc_2:children]
dc_2_webservers
dc_2_appservers
dc_2_dbservers
# DC3 -----------
[dc_3_webservers]
10.43.20.10
[dc_3_appservers]
10.43.20.20
10.43.20.21
[dc_3_dbservers]
10.43.20.30
[dc_3:children]
dc_3_webservers
dc_3_appservers
dc_3_dbservers
[webservers:children]
dc_1_webservers
dc_2_webservers
dc_3_webservers
[appservers:children]
dc_1_appservers
dc_2_appservers
dc_3_appservers
我故意在這裡只留下 IP 位址,因為我想了解純 Ansible 解決方案如何運作,而不是求助於 DNS。
問題是正確填充 nginx 的反向代理上游,以便僅新增每個 DC 本地的應用程式伺服器當 nginx 角色運行並將設定檔模板複製到負載平衡器電腦上。特別是,是否可以做這樣的事情?
# file /etc/nginx/sites-enabled/loadbalancer.conf in lb.D[n] (i.e. lb.D2)
upstream backend {
# Iterate over the app servers in the current data center (i.e. D2)
{% for host in [datacenters][current_datacenter][appservers] %}
# Add each local app server IP to the load balancing pool
# (i.e. 10.43.10.20 and 10.43.10.21 for DC2)
server {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }};
{% endfor %}
}
一方面,我不確定主機檔案是否完全有意義(我是否應該向各個條目添加變數?在當前配置中,我無法執行類似 [dc][3][appservers] 的操作,即使我不確定這就是解決方案所在。
非常感謝!
編輯1:
該劇本的結構如下:
main.yml
hosts
vars.yml
servers/
webservers.yml
appservers.yml
roles/
base/
files/
ssh/
newrelic/
tasks/
main.yml
handlers/
main.yml
webserver/
files/
ssl_certs/
templates/
nginx/
loadbalancer.j2
tasks/
main.yml
handlers/
main.yml
appserver/
files/
pip/
requirements.txt
templates/
supervisor/
gunicorn.j2
tasks/
main.yml
handlers/
main.yml
main.yml 入口點只有兩行:
---
- include: servers/webservers.yml
- include: servers/appservers.yml
webservers.yml 收集有關應用程式伺服器的事實(我認為這是實現我的目標所必需的,儘管我還不完全確定如何實現),然後首先調用一個基本角色,該角色僅安裝一些共享SSH 金鑰、 NewRelic 綁定和其他我們雲端中每台機器都通用的東西,然後呼叫實際的網頁伺服器角色。
---
- name: Gather data about appservers
hosts: appservers
gather_facts: yes
tasks:
- debug: Gather Facts
- name: Configure all frontend web servers
hosts: webservers
sudo: yes
roles:
- { role: base }
- { role: webserver }
所述「webserver」角色安裝 nginx,複製 SSL 證書,最後複製 jinja2 nginx 設定範本。
- name: Install nginx configuration file.
template: src=files/loadbalancer.j2 dest=/etc/nginx/sites-available/{{ project_name }} backup=yes
答案1
您可以利用魔法變數 group_names
並groups
尋找清單中定義的群組:
---
- hosts: webservers
vars:
dcs: [dc_1, dc_2, dc_3]
tasks:
- debug:
msg: |
upstream backend {
{%- for dc in dcs %}
{%- if dc in group_names %}
{%- for host in groups[dc+'_appservers'] %}
server {{host}};
{%- endfor %}
{%- endif %}
{%- endfor %}
}
該劇本將為您提供以下輸出。
TASK: [debug ] ****************************************************************
ok: [10.43.0.10] => {
"msg": "upstream backend { server 10.43.0.20; server 10.43.0.21;}"
}
ok: [10.43.10.10] => {
"msg": "upstream backend { server 10.43.10.20; server 10.43.10.21;}"
}
ok: [10.43.20.10] => {
"msg": "upstream backend { server 10.43.20.20; server 10.43.20.21;}"
}
server {{host}};
根據需要進行更改。