多数据中心Ansible负载均衡器模板

我将现有的多数据中心设置的pipe理迁移到Ansible,但我不确定什么是最好的build模方法,因为我是新手。

我有三个数据中心D1,D2和D3。 在每一个,相同的configuration重复相同的:

  • 绑定到公共IP的nginx负载平衡器 (lb.D [n])
  • 两个应用程序服务器 (如[1-2] .D [n])仅从本地负载平衡器接收stream量
  • 数据库服务器 (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解决scheme将如何工作,而不是诉诸于DNS。

问题是nginx的反向代理上传正确,因此只有当运行nginxangular色并将configuration文件模板复制到负载均衡器机器上时, 才会添加每个DC本地的应用程序服务器 。 特别是可以这样做吗?

 # file /etc/nginx/sites-enabled/loadbalancer.conf in lb.D[n] (ie lb.D2) upstream backend { # Iterate over the app servers in the current data center (ie D2) {% for host in [datacenters][current_datacenter][appservers] %} # Add each local app server IP to the load balancing pool # (ie 10.43.10.20 and 10.43.10.21 for DC2) server {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}; {% endfor %} } 

有一件事我不确定主机文件是否完全有意义(我是不是应该为每个条目添加variables?在当前的configuration中,我不能像[dc] [3] [appservers]那样做,尽pipe我不确定这就是解决scheme所在。)

非常感谢你!

编辑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收集关于appservers的事实(我认为这是实现我的目标所必需的,尽pipe我还不完全确定),然后首先调用一个基本angular色,只安装一些共享的SSH密钥,NewRelic绑定和其他这些对我们云中每台机器都很常见,然后调用实际的web服务器angular色。

 --- - 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 } 

说“web服务器”angular色安装nginx,复制SSL证书,然后复制jinja2 nginxconfiguration模板。

  - name: Install nginx configuration file. template: src=files/loadbalancer.j2 dest=/etc/nginx/sites-available/{{ project_name }} backup=yes 

您可以使用魔术variables group_namesgroups来查找清单中定义的组:

 --- - 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}}; 因为你需要。