1. 程式人生 > >使用ansible結合keepalived高可用,nginx反向代理部署小型企業環境

使用ansible結合keepalived高可用,nginx反向代理部署小型企業環境

ansible自動部署 keepalived高可用 nginx反向代理 mysql數據庫

前言:

ansible作為一款靈活、高效、功能豐富的自動化部署工具在企業運維管理中備受推崇。本文演示使用ansible部署小型企業服務框架,實現高可用、負載均衡的目標。如有錯誤敬請賜教。

目標環境拓撲:

技術分享圖片

環境介紹:

前端代理層由兩臺nginx實現,並安裝keepalived實現地址滑動達成高可用。

web層由兩套Apache+PHP+WordPress 構建應用環境。數據層由一臺mariadb組成,篇幅限制這裏並沒有做數據庫主從復制、讀寫分離(實際環境數據庫一定要實現這兩項功能)。

IP一覽:

技術分享圖片

vip 172.18.43.88


環境準備:

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.出現錯誤仔細看看錯誤日誌,耐心點問題肯沒想的那麽難。



使用ansible結合keepalived高可用,nginx反向代理部署小型企業環境