ansible系列(31)--ansible实战之部署WEB集群架构(1)
1. WEB集群环境说明
WEB集群环境说明如下:
- 客户端:模拟外网主机,地址:192.168.50.1;
- DNS服务器:主机名:dns01;地址:ETH1:192.168.20.70;ETH2:192.168.50.70;
- 路由器:主机名:router;地址:ETH1:192.168.20.17;ETH2:192.168.50.17,192.168.50.200192.168.50.201;
- LVS+keepalived集群:
- 主机名:lvs01;地址:ETH1:192.168.20.31;
- 主机名:lvs02;地址:ETH1:192.168.20.32;
- 虚IP:192.168.20.200和192.168.20.201;
- LVS使用DR模式;
- nginx负载均衡集群:
- 主机名:lb01;地址:ETH1:192.168.20.19;
- 主机名:lb02;地址:ETH1:192.168.20.20;
- WEB集群:
- 主机名:web01;地址:ETH1:192.168.20.22;
- 主机名:web02;地址:ETH1:192.168.20.23;
- MySQL服务器:主机名:mysql01;地址:ETH1:192.168.20.50;
- redis服务器:主机名:redis01;地址:ETH1:192.168.20.61;
- NFS服务器:主机名:nfs01;地址:ETH1:192.168.20.30;

WEB集群访问步骤如下:
- 客户端访问网站
wordpress.xuzhichao.com,把DNS指向192.168.50.70的dns服务器,在dns服务器上将域名解析为两个虚地址,192.168.50.200和192.168.50.201,使用dns轮询方式返回给客户端,达到负载分担的作用。 - 出口路由器上有多个公网地址,
192.168.50.17,虚地址192.168.50.200和192.168.50.201,使用DNAT地址映射,把内网实际虚IP192.168.20.200和192.168.20.201分别映射为192.168.50.200和192.168.50.201。 - 路由器后端是
LVS+keepalived的四层负载均衡,使用LVS的DR模式,为达到两个LVS负载分担的,建立两组VRRP,两台LVS分别是两组虚IP地址192.168.20.200和192.168.20.201的MASTER节点,同时互为BACKUP节点。 LVS后端使用nginx负载均衡做7层负载均衡,因为nginx做负载均衡时会受到源端口号的限制,因此可以多部署几个nginx负载均衡,提升集群性能。LVS后端是WEB集群,使用nginx+PHP组成,nginx提供静态站点,PHP-fpm解析php代码。redis服务器用于解决WEB集群的缓存不一致问题,把会话缓存统一放置在redis服务器中。mysql独立部署,提供数据库功能,存放结构化数据。NFS服务器则为WEB集群提供共享存储,存放图片等资源,无论用户被调度到哪一台WEB节点,都可以访问相同的图片,视频等资源。
2. ansible部署WEB集群实现思路
ansible编排web集群的实现逻辑如下图,共分为三个阶段来实现:
-
基础环境模块:
基础环境模块采用一个单独的
role来编写,是应用于所有主机的基础功能,主要包括:- 基础软件安装;
yum仓库配置;- 关闭
firewalld防火墙,selinux; - 添加基础用户;
-
应用环境模块:
应用环境模块需要把可能使用到的每一个应用都以一个独立的
role来实现,仅实现软件的基础功能,例如安装,配置,启动等,以便于上层业务模块进行调用。应用模块要写的独立,全面,复用性好;
-
业务环境模块:
业务环境模块用以实现不同的业务或代码,例如
wordpress,zrlog等,业务模块的实现需要调用应用环境的模块组件,再配合相关业务的定制配置,例如nginx虚拟主机,数据库创建,代码部署(应该由Jenkins实现)等。

3. ansible基础环境部署
-
创建集群环境的目录,所有功能均在此目录下实现:
[root@xuzhichao ansible]# mkdir cluster-roles/ -
在
cluster-roles/目录下建立ansible的配置文件,并修改内容如下:[root@xuzhichao cluster-roles]# grep -v "^#" ansible.cfg | grep -v "^$" [defaults] inventory = /data/ansible/cluster-roles/hosts gathering = smart fact_caching_timeout = 86400 fact_caching = redis fact_caching_connection = 127.0.0.1:6379 roles_path = /etc/ansible/roles:/data/ansible/roles:/opt host_key_checking = False private_role_vars = yes -
定义本项目的
inventory主机清单文件:[root@xuzhichao cluster-roles]# cat hosts [dns] 192.168.20.70 [lvs] 192.168.20.31 192.168.20.32 [webservers] 192.168.20.22 192.168.20.23 [lbservers] 192.168.20.19 192.168.20.20 [mysql] 192.168.20.50 [redis] 192.168.20.61 [nfs] 192.168.20.30 -
变量规划:整个集群环境的变量进行统一管理,统一放置在
group_vars/all文件中,所有role都可以调用。[root@xuzhichao cluster-roles]# ll group_vars/ total 0 -rw-r--r-- 1 root root 0 Aug 9 09:19 all -
为所有主机设置
ssh秘钥登录,使用expect脚本实现:[root@xuzhichao cluster-roles]# yum install expect [root@xuzhichao cluster-roles]# cat auto_sshkey.sh network=192.168.20 user=root password=123456 for i in 19 20 22 23 30 31 32 50 61 70 do /usr/bin/expect <<-EOF set timeout 30 spawn ssh-copy-id $user@$network.$i expect { "yes/no" { send "yes\n"; exp_continue } "password:" { send "${password}\n"; exp_continue } } expect eof EOF done [root@xuzhichao cluster-roles]# sh auto_sshkey.sh -
测试所有被控主机能否正常使用
ansible管理:[root@xuzhichao cluster-roles]# ansible all -m ping

浙公网安备 33010602011771号