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;

ansible系列(31)--ansible实战之部署WEB集群架构(1)

WEB集群访问步骤如下:

  • 客户端访问网站wordpress.xuzhichao.com,把DNS指向192.168.50.70dns服务器,在dns服务器上将域名解析为两个虚地址,192.168.50.200192.168.50.201,使用dns轮询方式返回给客户端,达到负载分担的作用。
  • 出口路由器上有多个公网地址,192.168.50.17,虚地址192.168.50.200192.168.50.201,使用DNAT地址映射,把内网实际虚IP192.168.20.200192.168.20.201分别映射为192.168.50.200192.168.50.201
  • 路由器后端是LVS+keepalived的四层负载均衡,使用LVSDR模式,为达到两个LVS负载分担的,建立两组VRRP,两台LVS分别是两组虚IP地址192.168.20.200192.168.20.201MASTER节点,同时互为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实现)等。

ansible系列(31)--ansible实战之部署WEB集群架构(1)

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
    
上一篇:ansible系列(32)--ansible实战之部署WEB集群架构(2)


下一篇:playbook实战优化