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