使用ansible结合keepalived高可用,nginx反向代理部署小型企业环境

文章目录

[隐藏]

  • 前言:
  • 环境介绍:
  • IP一览:
  • 环境准备:
  • 配置web的playbook:
  • 配置代理层:
  • 配置mariadb:
  • 开始表演(执行剧本):
  • 项目总结:
前言:

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

环境介绍:

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

IP一览:

环境准备:

1.管理端安装ansible,配置ssh秘钥使主机间实现基于秘钥的认证

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

2.编辑ansible的hosts文件,定义所有的主机
vim /etc/ansible/hosts

3.为所有主机同步时间

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

4.创建ansible相关角色的目录

mkdir -pv /etc/ansible/roles/{mysql,web,nginx}/{files,tasks,templates,vars,handlers,meta}  
配置web的playbook:

1.创建tasks文件

vim /etc/ansible/roles/web/task/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  

2.创建handles

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

3.添加要复制过去的配置文件
放在/etc/ansible/roles/web/files/下 ① WordPress目录 ② httpd.conf #从别的地方考过来
4.修改WordPress连接数据库的配置文件

 cd wordpress   cp wp-sample-config.php  wp-config.php   vim wp-config.php  


5.添加web主剧本

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

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

ansible-playbook -C /etc/ansible/web.yml  
配置代理层:

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=true    with_items:    - keepalived    - nginx  

2.添加handlers

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

3.准备template文件 ①keepalived.conf.j2 ②nginx.conf.j2
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      }  }  

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

upstream web {                        #新增段          server 172.18.43.61;          server 172.18.43.62;      }      server {          listen       80 default_server;          listen       [::]:80 default_server;          server_name  _;          root         /usr/share/nginx/html;            # Load configuration files for the default server block.          include /etc/nginx/default.d/*.conf;        location / {                     #新增段          proxy_pass          }      }  

6.添加nginx主剧本

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

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

ansible-playbook -C /etc/ansible/nginx.yml  
配置mariadb:

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"  

2.设置files文件

vim roles/mysql/files/mysql.sql  CREATE DATABASE wp;  GRANT ALL ON wp.* TO 'wpuser'@'%' IDENTIFIED BY 'lovelinux';  

3.添加mysql主剧本

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

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

ansible-playbook -C /etc/ansible/mysql.yml  
开始表演(执行剧本):

1.目录结构

2.分别执行

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

3.访问页面http://172.18.43.88/wordpress

项目总结:

1.在定义web的playbook时复制wordpress时开始用的是copy模块执行总是不成功,报错ERROR! A worker was found in a dead state。在确认自己没有语法错误后,百度查找原因无果最后在Google上找到了答案(英文不好不要心虚,技术问题语法都很简单很容易看懂,个别单词查查有道词典就好了),所以有在IT技术的问题问Google准没错。用synchronize模块要比copy模块高效安全的多,synchronize采用rsync复制文件,所以系统必须安装rsync 包否则无法使用这个模块。使用该模块的优点有①增量复制(只复制与目标主机有差异的文件) ② 复制时采用压缩,对复制大文件支持优秀(用copy复制大文件会出错),以下整理了一些synchronize参数:
archive # 是否采用归档模式同步,即以源文件相同属性同步到目标地址
copy_links # 同步的时候是否复制连接
links # Copy symlinks as symlinks
delete # 删除源中没有而目标存在的文件(即以推送方为主)
dest= # 目标地址
dest_port # 目标接受的端口,ansible配置文件中的 ansible_ssh_port 变量优先级高于该 dest_port 变量
dirs # 以非递归的方式传输目录
2.如mysql主机曾经安装过mariadb可能会出现导入SQL命令失败的情况,这时要将mysql的数据库删掉,默认位置在/var/lib/mysql/下
3.编辑nginx代理时注意语句的位置不要写错
4.出现错误仔细看看错误日志,耐心点问题肯没想的那么难。

原文出处:大飞侠大虾 -> http://blog.51cto.com/arm2012/2045823

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。