Ansible 企业高可用负载均衡部署方案

一、前言

ansible作为一款灵活、高效、功能丰富的自动化部署工具在企业运维管理中备受推崇。经过测试,我来使用ansible部署小型企业服务框架,实现高可用、负载均衡的目标。如有错误敬请赐教。

目标环境拓扑:

环境介绍:

前端代理层由两台nginx实现,并安装keepalived实现地址滑动达成高可用。 web层由两套Apache+PHP+WordPress 构建应用环境。数据层由一台mariadb组成,篇幅限制这里并没有做数据库主从复制、读写分离(实际环境数据库一定要实现这两项功能)。

IP一览:

二、环境准备:

2.1 管理端安装ansible,配置ssh秘钥使主机间实现基于密钥的认证,测试是否可以互相连接!

ssh-keygen  -t rsa  #三次回车,中途的问题是问秘钥存放位置(默认/root/.ssh),是否加密秘钥。实验方便这里不加密。
ssh-copy-id -i .ssh/id_rsa.pub [email protected]172.18.43.71 #将公钥发送给目标主机
ssh-copy-id -i .ssh/id_rsa.pub [email protected]172.18.43.72
ssh-copy-id -i .ssh/id_rsa.pub [email protected]172.18.43.73
ssh-copy-id -i .ssh/id_rsa.pub [email protected]172.18.43.61
ssh-copy-id -i .ssh/id_rsa.pub [email protected]172.18.43.62

2.2 编辑ansible的hosts文件,定义所有的主机

vim /etc/ansible/hosts

2.3 为所有主机同步时间

ansible all -a 'ntpdate 172.18.0.1'

#我这里是同步自己局域网的ntp服务器,实验的话选取同一台主机保证时间相同即可

2.4 创建ansible相关角色的目录

mkdir -pv /etc/ansible/roles/{mysql,web,nginx}/{files,tasks,templates,vars,handlers,meta}

三、配置web的playbook:

3.1 创建tasks文件

vim /etc/ansible/roles/web/tasks/main.yml
- name: install web pakgs
  yum: name={{ item }}
  with_items:
  - httpd
  - php
  - php-mysql
- name: config  web
  copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
  notify: restart the service # 注意这里要与handlers里定义的name相同
- name: copy wordpress
  synchronize: src=wordpress dest=/var/www/html/wordpress/
- name: restart the service
  service: name=httpd state=started

3.2 创建handles

vim /etc/ansible/roles/web/handlers/main.yml
- name: restart the service  #就这
  service: name=httpd state=restarted

3.3 添加要复制过去的配置文件

放在/etc/ansible/roles/web/files/下 ① WordPress目录 ② httpd.conf #从别的地方考过来

3.4 修改WordPress连接数据库的配置文件

cd wordpress
cp wp-config-sample.php  wp-config.php
vim wp-config.php
## 配置wordpress的具体我就不多说了,我站点早前分享过了!

3.5 添加web主剧本

vim /etc/ansible/web.yml
- hosts: web
  remote_user: root
  roles:
  - web

3.6 测试,没问题的话就下一步

(-C, –check 指定该参数后,执行playbook文件不会真正去执行,而是模拟执行一遍,然后输出本次执行会对远程主机造成的修改)

ansible-playbook -C /etc/ansible/web.yml

四、配置代理层:

4.1 添加task任务

vim /etc/ansible/roles/nginx/tasks/main.yml
- name: install package
  yum: name={{ item }}
  with_items:
  - nginx
  - keepalived
- name: config keepalived
  template: src=keepalived.conf.j2 dest=/etc/keepalived/keepalived.conf
  notify: restart keepalived
- name: config nginx
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  notify: restart nginx
- name: start service
  service: name={{ item }} state=started enabled=yes
  with_items:
  - keepalived
  - nginx

4.2 添加handlers

vim /etc/ansible/roles/nginx/handlers/main.yml
- name: restart keepalived
  service: name=keepalived state=restarted
- name: restart nginx
  service: name=nginx state=restarted

4.3 准备template文件

①keepalived.conf.j2  ②nginx.conf.j2

4.4 修改keepalived模板文件

global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id {{ansible_hostname}} #自带变量,通过ansible 主机IP -m setup 查询
   vrrp_mcast_group4 224.0.0.43
}

vrrp_instance VI_1 {
    state {{ state }} #已通过hosts文件定义变量
    interface ens33 #网卡名
    virtual_router_id 51
    priority {{ priority }}
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass lovelinux #设置密码
    }
    virtual_ipaddress {
        172.18.43.88 #虚拟IP
    }
}

4.5 修改nginx模板文件(定义在http段)

events {
  worker_connections  1024;  ## Default: 1024
}
http
{
upstream servers2.mydomain.com {
        server 172.18.43.61;
        server 172.18.43.62;
        ip_hash;

}

server{
    listen 80;
    server_name www.mydomain.com;
    root        /usr/share/nginx/html;

    location / {
        proxy_pass http://servers2.mydomain.com;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
}

4.6 添加nginx主剧本

vim /etc/ansible/nginx.yml
- hosts: nginx
  remote_user: root
  roles:
  - nginx

4.7 测试,没问题的话就下一步

ansible-playbook -C /etc/ansible/nginx.yml

五、配置mariadb:

5.1 配置mariadb的任务清单

roles/mysql/tasks/main.yml
- name: install mariadb
  yum: name=mariadb-server
- name: copy sql file
  copy: src=mysql.sql dest=/tmp/mysql.sql
- name: start mysql service
  service: name=mariadb state=started
- name: config mysql
  shell: "mysql < /tmp/mysql.sql"

5.2 设置files文件

vim /etc/ansible/roles/mysql/files/mysql.sql

CREATE DATABASE wp;

GRANT ALL ON wp.* TO 'wpuser'@'%' IDENTIFIED BY 'lovelinux';

5.3 添加mysql主剧本

vim /etc/ansible/mysql.yml
- hosts: mysql
  remote_user: root
  roles:
  - mysql

5.4 测试,没问题的话就下一步

ansible-playbook -C /etc/ansible/mysql.yml

六、开始表演(执行剧本):

6.1 目录结构

6.2 分别执行

ansible-playbook  web.yml
ansible-playbook  nginx.yml
ansible-playbook  mysql.yml

6.3 访问页面

http://172.18.43.88/wordpress

错误集锦:

这个是在整第二步 nginx+keepalived配置的时候出现的错误。

问题解决:在main.yml中 configure nginx 以及configure keepalived 应该是template 模块 而不是copy (脑抽了应该~)

问题解决:

还是报错,还有问题,一直在思考这个state 到底是哪儿定义的参数呢? 最终在keepalived.conf.j2 里面发现了这个参数。这个参数是调取哪儿的值呢? (自己其实想到了,明明记得已经添加这个参数了~~(╯-╰)/)

/etc/ansible/hosts

继续新的报错:

- name: start service
  service: name={{ item }} state=started enabled=true
  
 ## 最后的enabled=true改为 enabled=yes

虽然我这边没有写,但是在真正运行后再启动nginx服务的时候还是遇到了很多问题。 遇到问题,不要担心,认认真真看错误日志,查下资料,就搞定了!!

七、项目总结:

7.1 在定义web的playbook时复制wordpress时开始用的是copy模块执行总是不成功,报错

ERROR! A worker was found in a dead state

在确认自己没有语法错误后,百度查找原因无果最后在Google上找到了答案(英文不好不要心虚,技术问题语法都很简单很容易看懂,个别单词查查有道词典就好了),所以有在IT技术的问题问Google准没错。用synchronize模块要比copy模块高效安全的多,synchronize采用rsync复制文件,所以系统必须安装rsync 包否则无法使用这个模块。

使用该模块的优点有

① 增量复制(只复制与目标主机有差异的文件) 
② 复制时采用压缩,对复制大文件支持优秀(用copy复制大文件会出错)

7.2 以下整理了一些synchronize参数:

archive # 是否采用归档模式同步,即以源文件相同属性同步到目标地址

copy_links # 同步的时候是否复制连接

links # Copy symlinks as symlinks

delete # 删除源中没有而目标存在的文件(即以推送方为主)

dest= # 目标地址

dest_port # 目标接受的端口,ansible配置文件中的

ansible_ssh_port 变量优先级高于该 dest_port 变量

dirs # 以非递归的方式传输目录

7.3 mysql的数据库删掉**,默认位置在/var/lib/mysql/下

7.4 编辑nginx代理时注意语句的位置不要写错

虽然遇到了很多问题,还有很多莫名其妙的小问题,其实出现错误仔细看看错误日志,或者提示的内容,耐心点,问题肯没想的那么难!!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Porschev[钟慰]的专栏

Nodejs学习笔记(六)--- Node.js + Express 构建网站预备知识

前言   前面经过五篇Node.js的学习,基本可以开始动手构建一个网站应用了,先用这一篇了解一些构建网站的知识!   主要是些基础的东西...   如何去创建...

3467
来自专栏郭少华

(Vue全家桶)Vue-cli

安装vue-cli的前提是你已经安装了npm,安装npm你可以直接下载node的安装包进行安装。你可以在命令行工具里输入npm -v 检测你是否安装了npm和...

2893
来自专栏王小雷

Ubuntu16.04安装后开发环境配置和常用软件安装

Ubuntu16.04安装后1.安装常用软件搜狗输入法+编辑器Atom+浏览器Chome+视频播放器vlc+图像编辑器GIMP Image Editor安装+视...

3875
来自专栏云计算教程系列

如何使用Prometheus监视您的Ubuntu 14.04服务器

Prometheus是由SoundCloud开发的开源监控系统。与其他监控系统(如InfluxDB和Graphite)一样,Prometheus将其所有数据存储...

2050
来自专栏hbbliyong

Ubuntu16.04安装后开发环境配置和常用软件安装

Ubuntu16.04安装后1.安装常用软件搜狗输入法+编辑器Atom+浏览器Chome+视频播放器vlc+图像编辑器GIMP Image Editor安装+视...

4388
来自专栏西枫里博客

宝塔面板操作多个域名做301跳转

都知道在网站更换域名的过程中为了保住收录和排名,就需要通过搜索引擎提供的改版工具来进行操作。而其中最重要的就是对老域名进行301永久重定向获得搜索引擎的收录更新...

4741
来自专栏实用工具入门教程

如何部署 MongoDB 集群

MongoDB是一个领先的非关系型数据库管理系统,也是NoSQL运动的重要成员。MongoDB不是使用关系数据库管理系统(RDBMS)的表和固定模式,而是在文档...

4301
来自专栏码农笔录

手动下载genymotion ova镜像文件,genymotion下载失败、慢解决方案

2254
来自专栏calvin

asp.net core 编译mvc,routing,security源代码进行本地调试

因为各种原因,需要查看asp.net core mvc的源代码来理解运行机制等等,虽说源代码查看已经能很好的理解了。但是能够直接调试还是最直观的。所有就有了本次...

1392
来自专栏零基础使用Django2.0.1打造在线教育网站

零基础使用Django2.0.1打造在线教育网站(四):简易留言簿基础开发

努力与运动兼备~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

4165

扫码关注云+社区

领取腾讯云代金券