我正在将现有多数据中心设置的管理迁移到 Ansible,但我不确定建模它的最佳方法是什么,因为我是新手。
我有三个数据中心 D1、D2 和 D3。在每个中,相同的配置以相同的方式重复:
到目前为止,我制作的主机文件看起来像这样:
# 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
Run Code Online (Sandbox Code Playgroud)
我特意在这里只留下 IP 地址,因为我想了解纯 Ansible 解决方案如何工作,而不是求助于 DNS。
问题是正确填充 nginx 的反向代理上游,以便在运行 nginx 角色并将配置文件模板复制到负载平衡器机器时,只添加每个 DC 本地的应用程序服务器。特别是,是否有可能做这样的事情?
# 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 %}
}
Run Code Online (Sandbox Code Playgroud)
一方面,我不确定 hosts 文件是否完全有意义(我应该向各个条目添加变量吗?在当前配置中,我无法执行类似 [dc][3][appservers] 的操作,即使我不确定这就是解决方案所在。)
非常感谢!
编辑 1:
playbook的结构如下:
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
Run Code Online (Sandbox Code Playgroud)
main.yml 入口点只有两行:
---
- include: servers/webservers.yml
- include: servers/appservers.yml
Run Code Online (Sandbox Code Playgroud)
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 }
Run Code Online (Sandbox Code Playgroud)
所说的“网络服务器”角色安装 nginx,复制 SSL 证书,然后最后复制 jinja2 nginx 配置模板。
- name: Install nginx configuration file.
template: src=files/loadbalancer.j2 dest=/etc/nginx/sites-available/{{ project_name }} backup=yes
Run Code Online (Sandbox Code Playgroud)
您可以利用魔法变量 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 %}
}
Run Code Online (Sandbox Code Playgroud)
该剧本将为您提供以下输出。
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;}"
}
Run Code Online (Sandbox Code Playgroud)
server {{host}};根据需要进行更改。