前言:php
ansible做爲一款靈活、高效、功能豐富的自動化部署工具在企業運維管理中備受推崇。本文演示使用ansible部署小型企業服務框架,實現高可用、負載均衡的目標。若有錯誤敬請賜教。
html
目標環境拓撲:
前端
環境介紹:mysql
前端代理層由兩臺nginx實現,並安裝keepalived實現地址滑動達成高可用。
linux
web層由兩套Apache+PHP+WordPress 構建應用環境。數據層由一臺mariadb組成,篇幅限制這裏並無作數據庫主從複製、讀寫分離(實際環境數據庫必定要實現這兩項功能)。
nginx
IP一覽:
web
vip 172.18.43.88 sql
環境準備:shell
1.管理端安裝ansible,配置ssh祕鑰使主機間實現基於祕鑰的認證
數據庫
ssh-keygen -t rsa #三次回車,中途的問題是問祕鑰存放位置(默認/root/.ssh),是否加密祕鑰。實驗方便這裏不加密 ssh-copy-id -i .ssh/id_rsa.pub root@172.18.43.71 #將公鑰發送給目標主機 ssh-copy-id -i .ssh/id_rsa.pub root@172.18.43.72 ssh-copy-id -i .ssh/id_rsa.pub root@172.18.43.73 ssh-copy-id -i .ssh/id_rsa.pub root@172.18.43.61 ssh-copy-id -i .ssh/id_rsa.pub root@172.18.43.62
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 { acassen@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc 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.出現錯誤仔細看看錯誤日誌,耐心點問題肯沒想的那麼難。