实战:ansible自动化部署nginx+keepalived+mysql负载均衡集群



一、目的

使用ansible自动化部署nginx+keepalived+mysql负载均衡集群。

二、拓扑规划

三、详细步骤

1、环境的搭建

(1)、安装ansible,同时配置私钥免密码进行通信

[[email protected] ~]# ssh-keygen  -t rsa #-t表示使用的加密类型,其中rsa1表示version1版本,rsa、dsa、ecdsa的加密对于的是version2版本
Generating public/private rsa key pair.
#这里询问你要把生成的密钥文件保存在哪里,默认是在家目录下的.ssh文件夹中,回车保存默认目录
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory ‘/root/.ssh‘.
#这里是对密钥文件加密,不输入则表示不加密
Enter passphrase (empty for no passphrase): 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
04:9f:cb:9c:9d:1e:47:d7:e1:d4:c1:87:71:c3:a4:22 [email protected]
The key‘s randomart image is:
+--[ RSA 2048]----+
|      .       =O+|
|       o .    ===|
|        +E .....o|
|       + +.o..   |
|        S + .    |
|         . o     |
|          .      |
|                 |
|                 |
+-----------------+
-

(2)查看已经成功生成了一对密钥

[[email protected] ~]# ls /root/.ssh
id_rsa  id_rsa.pub#其中id_rsa为私钥,id_rsa.pub为公钥

-

(3)在生成完密钥对之后将公钥上传给服务器对应用户的家目录

[[email protected] ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
[[email protected] ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
[[email protected] ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
[[email protected] ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
[[email protected] ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]

(4)编辑ansible的hosts文件,定义后所有的主机

[19:05 [email protected]/etc/ansible]# cat hosts 
# This is the default ansible ‘hosts‘ file.
#
# It should live in /etc/ansible/hosts
#
#   - Comments begin with the ‘#‘ character
#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses
#   - A hostname/ip can be a member of multiple groups
# Ex 1: Ungrouped hosts, specify before any group headers.
[web]
10.1.252.215
10.1.252.235
[nginx]
10.1.253.107 state=MASTER priority=100
10.1.249.75  state=BACKUP priority=90
[mysql]
10.1.252.36

(5)OK,环境已经搭配好,所有主机同步下时间:

[19:34 [email protected]/etc/ansible]# ansible all -a ‘ntpdate 10.1.0.1‘
10.1.252.215 | success | rc=0 >>
 3 Nov 19:34:30 ntpdate[38293]: adjust time server 10.1.0.1 offset -0.003936 sec
10.1.252.36 | success | rc=0 >>
 3 Nov 19:34:30 ntpdate[3291]: adjust time server 10.1.0.1 offset 0.200434 sec
10.1.252.235 | success | rc=0 >>
 3 Nov 19:34:36 ntpdate[38723]: adjust time server 10.1.0.1 offset -0.001469 sec
10.1.253.107 | success | rc=0 >>
 3 Nov 19:34:37 ntpdate[7161]: adjust time server 10.1.0.1 offset -0.001905 sec
10.1.249.75 | success | rc=0 >>
 3 Nov 19:34:37 ntpdate[4951]: adjust time server 10.1.0.1 offset 0.018952 sec

2、下面来进行ansible的roles和playbook的定义:

(1)在/etc/ansible/roles目录下创建相关的角色目录:

[19:56 [email protected]/etc/ansible/roles]# mkdir -pv {mysql,web,nginx}/{files,tasks,templates,variables,handlers,meta,defult}
mkdir: created directory `mysql‘
mkdir: created directory `mysql/files‘
mkdir: created directory `mysql/tasks‘
mkdir: created directory `mysql/templates‘
mkdir: created directory `mysql/variables‘
mkdir: created directory `mysql/handlers‘
mkdir: created directory `mysql/meta‘
mkdir: created directory `mysql/default‘
mkdir: created directory `web‘
mkdir: created directory `web/files‘
mkdir: created directory `web/tasks‘
mkdir: created directory `web/templates‘
mkdir: created directory `web/variables‘
mkdir: created directory `web/handlers‘
mkdir: created directory `web/meta‘
mkdir: created directory `web/default‘
mkdir: created directory `nginx‘
mkdir: created directory `nginx/files‘
mkdir: created directory `nginx/tasks‘
mkdir: created directory `nginx/templates‘
mkdir: created directory `nginx/variables‘
mkdir: created directory `nginx/handlers‘
mkdir: created directory `nginx/meta‘
mkdir: created directory `nginx/default‘
[19:58 [email protected]/etc/ansible/roles]# tree
.
├── mysql
│   ├── default
│   ├── files
│   ├── handlers
│   ├── meta
│   ├── tasks
│   ├── templates
│   └── variables
├── nginx
│   ├── default
│   ├── files
│   ├── handlers
│   ├── meta
│   ├── tasks
│   ├── templates
│   └── variables
└── web
    ├── default
    ├── files
    ├── handlers
    ├── meta
    ├── tasks
    ├── templates
    └── variables
24 directories, 0 files

说明:

files/:存储由copy或script等模块调用的文件;

tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;

handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;

vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;

templates/:存储由template模块调用的模板文本;

meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;

default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

下面就是添加playbook了,首先设置web:

1、设置web的playbook

(1)Tasks:任务

[17:27 [email protected]/etc/ansible]# cat roles/web/tasks/main.yml 
- name: install web pakgs
  yum: name={{ item }}
  with_items:
  - httpd
  - php
  - php-mysql
- name: config the web
  copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
  notify: reload the service
- name: install wordpress
  copy: src=wordpress dest=/var/www/html/wordpress/
- name: restart the service
  service: name=httpd state=started

(2):handlers

[20:26 [email protected]/etc/ansible]# cat roles/web/handlers/main.yml 
- name: relaod the service
  service: name=httpd state=restarted

(3)添加需要的file:

[18:45 [email protected]/etc/ansible]# ll roles/web/files/
total 40
-rw-r--r--. 1 root   root      34419 Nov  2 20:23 httpd.conf  #主要是配置httpd的默认配置,要事先准备好
drwxr-xr-x. 5 nobody nfsnobody  4096 Nov  3 14:00 wordpress  #wordpres的安装程序,注意这里的配置文件已经更改了后面的连接数据库
[18:58 [email protected]/etc/ansible]#vim  roles/web/files/wordpress/wp-config.php 
/** WordPress数据库的名称 */
define(‘DB_NAME‘, ‘wp‘);
/** MySQL数据库用户名 */
define(‘DB_USER‘, ‘wpuser‘);
/** MySQL数据库密码 */
define(‘DB_PASSWORD‘, ‘wppass‘);
/** MySQL主机 */
define(‘DB_HOST‘, ‘10.1.252.109‘);
/** 创建数据表时默认的文字编码 */
define(‘DB_CHARSET‘, ‘utf8‘);

(4)添加主剧本:

[20:28 [email protected]/etc/ansible]# ll web.yml 
-rw-r--r--. 1 root root 51 Nov  2 20:22 web.yml
[20:28 [email protected]/etc/ansible]# pwd
/etc/ansible
[20:28 [email protected]/etc/ansible]# cat web.yml 
- hosts: web
  remote_user: root
  roles:
  - web

(5)检查语法没有问题:

[20:25 [email protected]/etc/ansible]# ansible-playbook --syntax-check web.yml 
playbook: web.yml

2、下面来部署前端的nginx调度起和keepalived配置:

(1)添加task任务:

[21:25 [email protected]/etc/ansible]#cat roles/nginx/tasks/main.yml 
- name: install pkgs
  yum: name={{ item }}
  with_items:
  - nginx
  - keepalived
- name: config nginx&keepalived
  template: src=nginx.j2 dest=/etc/nginx/nginx.conf
  template: src=keepalived.j2 dest=/etc/keepalived/keepalived.conf
  notify: reload the service
- name: start the service
  service: name={{ item }} state=started 
  with_items:
  - nginx
  - keepalived

(2)添加handlers:

[21:28 [email protected]/etc/ansible]#cat roles/nginx/handlers/mainx.yml 
- name: reload the service
  service: name={{ item }} state=restarted
  with_items:
  - nginx
  - keepalived

(3)在hosts列表中复制变量:

[21:31 [email protected]/etc/ansible]# cat hosts 
# This is the default ansible ‘hosts‘ file.
#
# It should live in /etc/ansible/hosts
#
#   - Comments begin with the ‘#‘ character
#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses
#   - A hostname/ip can be a member of multiple groups
# Ex 1: Ungrouped hosts, specify before any group headers.
[web]
10.1.252.215
10.1.49.29
[nginx]
10.1.253.107 state=MASTER priority=100
10.1.249.75  state=BACKUP priority=90
[mysql]
10.1.49.31

(4)在template中使用了变量:

nginx配置:

[21:33 [email protected]/etc/ansible]# cat roles/nginx/templates/nginx.j2 
user  nginx;
worker_processes  {{ ansible_processor_vcpus  }}; #使用变量,进程数为cpu数量:
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
                      ‘$status $body_bytes_sent "$http_referer" ‘
                      ‘"$http_user_agent" "$http_x_forwarded_for"‘;
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
upstream web {
server 10.1.24.113;
server 10.1.24.114;
 }
location / {
proxy_pass http://web;
}
}

keepalived配置:

[21:33 [email protected]/etc/ansible]# cat roles/nginx/templates/keepalived.j2 
! Configuration File for keepalived
global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state {{ state }}  #使用变量
    interface eno16777746
    virtual_router_id 55
    priority {{ priority }} #使用变量
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 232332
    }
    virtual_ipaddress {
        10.1.24.222
    }
}

(5)添加主剧本:

[21:30 [email protected]/etc/ansible]# cat nginx.yml 
- hosts: nginx
  remote_user: root
  roles:
  - nginx

(6)语法检测没有问题

[21:34 [email protected]/etc/ansible]#ansible-playbook --syntax-check nginxx.yml 
playbook: nginx.yml

3、设置mysql:

(1)设置task:

[18:46 [email protected]/etc/ansible]# cat roles/mysql/tasks/main.yml 
- name: install mysql
  yum: name=mysql-server
- name: copy sql file
  copy: src=mysql.sql dest=/tmp/mysql.sql
- name: start mysql service
  service: name=mysqld state=started
- name: config mysql
  shell: "mysql < /tmp/mysql.sql"

(2)设置files文件

[18:47 [email protected]/etc/ansible]# ll roles/mysql/files/
total 4
-rw-r--r--. 1 root root 78 Nov  3 15:41 mysql.sql
[18:48 [email protected]/etc/ansible]# cat !$
cat roles/mysql/files/
cat: roles/mysql/files/: Is a directory

(3)添加主剧本:

[18:48 [email protected]/etc/ansible]# cat mysql.yml 
- hosts: mysql
  remote_user: root
  roles:
  - mysql

(4)语法检查没有问题:

[18:49 root[email protected]/etc/ansible]# ansible-playbook --syntax-check mysql.yml 
playbook: mysql.yml

mysql的ansible配置已经完成

至此,web、nginx+keepalived、mysql的配置都已经完成,下面来依次执行剧本

先来看下整个目录的结构:

[19:05 [email protected]/etc/ansible]# tree -L 4
.
├── ansible.cfg
├── ansible.cfg.bak
├── hosts
├── mysql.yml
├── nginx.yml
├── roles
│   ├── mysql
│   │   ├── default
│   │   ├── files
│   │   │   └── mysql.sql
│   │   ├── handlers
│   │   ├── meta
│   │   ├── tasks
│   │   │   └── main.yml
│   │   ├── templates
│   │   └── variables
│   ├── nginx
│   │   ├── default
│   │   ├── files
│   │   │   └── nginx-1.10.0-1.el7.ngx.x86_64.rpm
│   │   ├── handlers
│   │   │   └── main.yml
│   │   ├── meta
│   │   ├── tasks
│   │   │   └── main.yml
│   │   ├── templates
│   │   │   ├── keepalived.j2
│   │   │   └── nginx.j2
│   │   └── variables
│   └── web
│       ├── default
│       ├── files
│       │   ├── httpd.conf
│       │   └── wordpress
│       ├── handlers
│       │   └── main.yml
│       ├── meta
│       ├── tasks
│       │   └── main.yml
│       ├── templates
│       └── variables
├── test.yaml
└── web.yml
26 directories, 17 files

(1)执行web:

[17:15 [email protected]/etc/ansible]# ansible-playbook  web.yml 
PLAY [web] ******************************************************************** 
GATHERING FACTS *************************************************************** 
ok: [10.1.252.235]
ok: [10.1.252.215]
TASK: [web | install web pakgs] *********************************************** 
ok: [10.1.252.215] => (item=httpd,php,php-mysql)
ok: [10.1.252.235] => (item=httpd,php,php-mysql)
TASK: [web | config the web] ************************************************** 
ok: [10.1.252.215]
ok: [10.1.252.235]
TASK: [web | install wordpress] *********************************************** 
changed: [10.1.252.235]
changed: [10.1.252.215]
TASK: [web | restart the service] ********************************************* 
ok: [10.1.252.215]
ok: [10.1.252.235]
PLAY RECAP ******************************************************************** 
10.1.252.215               : ok=5    changed=1    unreachable=0    failed=0   
10.1.252.235               : ok=5    changed=1    unreachable=0    failed=0

(2)执行mysql:

[18:52 [email protected]/etc/ansible]# ansible-playbook  mysql.yml 
PLAY [mysql] ****************************************************************** 
GATHERING FACTS *************************************************************** 
ok: [10.1.252.36]
TASK: [mysql | install mysql] ************************************************* 
ok: [10.1.252.36]
TASK: [mysql | copy sql file] ************************************************* 
ok: [10.1.252.36]
TASK: [mysql | start mysql service] ******************************************* 
ok: [10.1.252.36]
TASK: [mysql | config mysql] ************************************************** 
skipping: [10.1.252.36]
ok: [10.1.252.36]
PLAY RECAP ******************************************************************** 
10.1.252.36                : ok=4    changed=0    unreachable=0    failed=0

(3)执行nginx:

[18:53 [email protected]/etc/ansible]# ansible-playbook nginx.yml 
PLAY [nginx] ****************************************************************** 
GATHERING FACTS *************************************************************** 
ok: [10.1.249.75]
ok: [10.1.253.107]
TASK: [nginx | install keepalived] ******************************************** 
ok: [10.1.253.107]
ok: [10.1.249.75]
TASK: [nginx | copy nginx] **************************************************** 
changed: [10.1.249.75]
changed: [10.1.253.107]
TASK: [nginx | install nginx] ************************************************* 
ok: [10.1.249.75]
ok: [10.1.253.107]
TASK: [nginx | delete the nginx pkg] ****************************************** 
changed: [10.1.249.75]
changed: [10.1.253.107]
TASK: [nginx | config nginx&keepalived] *************************************** 
ok: [10.1.249.75]
ok: [10.1.253.107]
TASK: [nginx | config nginx&keepalived] *************************************** 
ok: [10.1.249.75]
ok: [10.1.253.107]
TASK: [nginx | start the service] ********************************************* 
ok: [10.1.253.107] => (item=keepalived)
ok: [10.1.249.75] => (item=keepalived)
ok: [10.1.253.107] => (item=nginx)
ok: [10.1.249.75] => (item=nginx)
PLAY RECAP ******************************************************************** 
10.1.249.75                : ok=8    changed=2    unreachable=0    failed=0   
10.1.253.107               : ok=8    changed=2    unreachable=0    failed=0

执行完成后,下面就是验证效果的时候:

激动的时刻,成功了!

个人在此过程中遇到的问题:在每个task中的name任务中不能有过多的任务,必须要分为多个步骤进行,如此例中的copy nginx然后在yum nginx,不能写在同一个name中,否则会报错!

OK,更多文章请关注我的博客

时间: 11-02

实战:ansible自动化部署nginx+keepalived+mysql负载均衡集群的相关文章

lvs+keepalived+nginx实现高性能负载均衡集群

一.为什么要使用负载均衡技术? 1.系统高可用性 2.  系统可扩展性 3.  负载均衡能力 LVS+keepalived能很好的实现以上的要求,LVS提供负载均衡,keepalived提供健康检查,故障转移,提高系统的可用性!采用这样的架构以后很容易对现有系统进行扩展,只要在后端添加或者减少realserver,只要更改lvs的配置文件,并能实现无缝配置变更! 二.LVS+Keepalived介绍 1.  LVS LVS是一个开源的软件,可以实现LINUX平台下的简单负载均衡.LVS是Linu

Mysql上的RAC:Percona XtraDB Cluster负载均衡集群安装部署手册

 Percona XtraDB Cluster安装部署手册 引言 编写目的 编写此文档,供PerconaXtraDB Cluster部署时使用. 预期读者 系统维护人员及实施人员. 编制依据及参考资料 目标 通过阅读该手册,让读者明确PerconaXtraDB Cluster的安装.配置和维护情况,为后续数据库运维工作提供指导. 应用部署方案 环境准备 服务器列表 序号 IP 用途 HOSTNAME 操作系统 1 192.168.0.7 Percona XtraDB Cluster RedHat

Nginx+Keepalived搭建高可用负载均衡集群

Nginx+Keepalived搭建高可用负载均衡集群   一. 环境说明 前端双Nginx+keepalived,nginx反向代理到后端的tomcat集群实现负载均衡,Keepalived实现集群高可用. 操作系统: Centos 6.6_X64 Nginx版本: nginx-1.9.5 Keepalived版本:keepalived-1.2.13 结构: Keepalived+nginx-MASTER:10.6.1.210         Keepalived+nginx-BACKUP:

nginx+keepalived的高可用负载均衡集群构建

实验架构图: 实验环境 Nginx和Keepalived原理介绍 参考博客:http://467754239.blog.51cto.com/4878013/1541421 1.nginx Nginx进程基于于Master+Slave(worker)多进程模型,自身具有非常稳定的子进程管理功能.在Master进程分配模式下,Master进程永远不进行业务处理,只是进行任务分发, 从而达到Master进程的存活高可靠性,Slave(worker)进程所有的业务信号都 由主进程发出,Slave(wor

keepalived+nginx实现高可用and负载均衡集群

keepalived+nginx实现高可用and负载均衡集群 前言 因生产环境需要,现需要搭建一个前端为nginx的HA双向互备.后端为nginx代理的loadbalance负载均衡集群.nginx进程基于于Master+Slave(worker)多进程模型,自身具有非常稳定的子进程管理功能.在Master进程分配模式下,Master进程永远不进行业务处理,只是进行任务分发,从而达到Master进程的存活高可靠性,Slave(worker)进程所有的业务信号都 由主进程发出,Slave(work

keepalived+nginx搭建高可用and负载均衡集群

keepalived+nginx搭建高可用and负载均衡集群 前言 因生产环境需要,现需要搭建一个前端为nginx的HA双向互备.后端为nginx代理的loadbalance负载均衡集群.nginx进程基于于Master+Slave(worker)多进程模型,自身具有非常稳定的子进程管理功能.在Master进程分配模式下,Master进程永远不进行业务处理,只是进行任务分发,从而达到Master进程的存活高可靠性,Slave(worker)进程所有的业务信号都由主进程发出,Slave(worke

【中级篇】部署Tomcat+Nginx负载均衡集群

部署Tomcat+Nginx负载均衡集群 1.          实验需求: 1)     2台服务器同时部署tomcat; 2) 部署Nginx 3) 搭建负载均衡,测试其效果. 2.          实验环境: Linux服务器系统版本:CentOS-6.5 -S02 IP:192.168.10.15  ( tomcat 2 ) Linux服务器系统版本:CentOS-6.5 -S03 IP : 192.168.10.18  ( Nginx) Linux服务器系统版本:  RedHat6.

HAProxy高可用负载均衡集群部署

HAProxy高可用负载均衡集群部署 基本信息: 系统平台:VMware WorkStation 系统版本: CentOS Linux release 7.2.1511 (Core) 内核版本: 3.10.0-327.el7.x86_64 集群架构: 前端:HAProxy 1.虚拟FQDN:www.simpletime.net 2.VIP:192.168.39.1:DIP:172.16.39.50 3.调度服务器:Varnish1.Varnish2 4.调度算法:URL_Hash_Consist

LVS+Keepalived 实现高可用负载均衡集群

简介: 随着网站业务量的增长,网站的服务器压力越来越大?需要负载均衡方案!商业的硬件如 F5 ,Array又太贵,你们又是创业型互联公司如何有效节约成本,节省不必要的浪费?同时还需要实现商业硬件一样的高性能高可用的功能?有什么好的负载均衡可伸张可扩展的方案吗?有!我们利用LVS+Keepalivd基于完整开源软件的架构可以为你提供一个负载均衡及高可用的服务器.  一.LVS+Keepalived  介绍 1.  LVS LVS是Linux Virtual Server的简写,意即Linux虚拟服