1. 程式人生 > >ansible-playbook 手工編譯安裝nginx

ansible-playbook 手工編譯安裝nginx

雖然nginx也可以通過yum安裝,但是如何使用原始碼包安裝並自定義開啟一些nginx功能模組,並且通過ansible下發到被管理叢集呢?下面給給位看官提供一個具體例項以供參考。
首先我們需要手工編譯好一臺nginx伺服器作為模板,再採用roles角色管理的方式將其解耦,並下發到被管理叢集,具體步驟如下:
實驗環境:
ansibleserver,nginx模板:(IP:192.168.252.130 centos7)
Mysqlserver: (IP:192.168.252.173 centos7)
Webserver: (IP:192.168.252.174 centos7)
1.手工編譯安裝一臺nginx伺服器,開啟功能模組,配置好conf檔案作為模板
--------安裝依賴包-------------------
yum -y install pcre-devel zlib-devel gcc gcc-c++ //安裝編譯環境

useradd -M -s /sbin/nologin nginx //建立nginx管理使用者

tar zxvf nginx-1.12.0.tar.gz -C /opt/ //解壓nginx原始碼包(所用版本為1.12.0)

-----------編譯----------------------
cd nginx-1.12.0/

./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module

make && make install

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ //建立軟連線讓系統識別nginx命令
指令碼註釋:--with-http_stub_status_module //支援狀態統計

2.製作nginx開機自啟動指令碼
vi /etc/init.d/nginx
#!/bin/bash
#chkconfig: - 99 20
#description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$PROG
;;
stop)
kill -s QUIT $(cat $PIDF)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PIDF)
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
chmod +x /etc/init.d/nginx
chkconfig --add nginx
chkconfig --level 35 nginx on
systemctl start nginx
systemctl status nginx
ansible-playbook 手工編譯安裝nginx


至此nginx模板製作完成,下面開始編輯playbook(想了解更多nginx模組功能及常用優化請看這裡



cd /etc/ansible
cd roles/
mkdir -p {common,install}/{handlers,files,meta,tasks,templates,vars}
roles目錄下有兩個角色,common存放安裝編譯環境操作的檔案,install存放安裝nginx操作的檔案。
ansible-playbook 手工編譯安裝nginx
common和install內各目錄含義解釋
files:用來存放由copy模組或script模組呼叫的檔案。
templates:用來存放jinjia2模板,template模組會自動在此目錄中尋找jinjia2模板檔案。
tasks:此目錄應當包含一個main.yml檔案,用於定義此角色的任務列表,此檔案可以使用include包含其它的位於此目錄的task檔案。
handlers:此目錄應當包含一個main.yml檔案,用於定義此角色中觸發條件時執行的動作。
vars:此目錄應當包含一個main.yml檔案,用於定義此角色用到的變數。
defaults:此目錄應當包含一個main.yml檔案,用於為當前角色設定預設變數。
meta:此目錄應當包含一個main.yml檔案,用於定義此角色的特殊設定及其依賴關係。



把先前手工編譯安裝好的nginx目錄打包,並放到install角色下的files下面,以及把啟動指令碼、配置檔案放到templates下面
tar -czvf nginx.tar.gz --exclude "nginx.conf" --exclude "vhost" nginx/ //把除了nginx.conf 以外的檔案打包命名為nginx
mv nginx.tar.gz /etc/ansible/roles/install/files/
cd /usr/local/nginx/
cp conf/nginx.conf /etc/ansible/roles/install/templates/
cp /etc/init.d/nginx /etc/ansible/roles/install/templates/
ansible-playbook 手工編譯安裝nginxansible-playbook 手工編譯安裝nginx



cd /etc/ansible/roles/common/tasks/
vim main.yml

  • name: Install initializtion require software
    yum: name="zlib-devel,pcre-devel,gcc,gcc-c++" state=latest
    //定義common下的tasks為nginx下載依賴包
    ansible-playbook 手工編譯安裝nginx


vim /etc/ansible/roles/install/vars/main.yml
nginx_user: nginx
nginx_port: 80
nginx_basedir: /usr/local/nginx
//定義intall下的vars,將nginx管理使用者,埠,所在路徑定義為變數方便以後呼叫



vim /etc/ansible/roles/install/tasks/copy.yml
name: Copy Nginx Software
copy: src=nginx.tar.gz dest=/opt/nginx.tar.gz owner=root group=root //將file資料夾下的nginx.tar.gz拷貝到/opt下,屬主為root,所屬組為root

  • name: Uncompression Nginx Software
    shell: tar zxf /opt/nginx.tar.gz -C /usr/local //解壓檔案包釋放到/usr/local下
  • name: Copy Nginx Start Script
    template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755 //將啟動指令碼從install下的templates裡複製到/etc/init.d下,屬主為root,所屬組為root組,並定義執行許可權
  • name: Copy Nginx Config
    template: src=nginx.conf dest={{ nginx_basedir }}/conf/ owner=root group=root mode=0644//將配置檔案nginx.conf複製到nginx所在目錄下的/conf/資料夾
    ansible-playbook 手工編譯安裝nginx


vim /etc/ansible/roles/install/tasks/copy.yml

  • name: Create Nginx User
    user: name={{ nginx_user }} state=present createhome=no shell=/sbin/nologin //給nginx建立管理使用者
  • name: Start Nginx Service
    shell: /etc/init.d/nginx start //使用啟動指令碼啟動nginx
  • name: Add Boot Start Nginx Service
    shell: chkconfig --level 35 nginx on //設定3,5級別開機自啟動
  • name: Delete Nginx compression files
    shell: rm -rf /opt/nginx.tar.gz //刪除之前的壓縮包
    ansible-playbook 手工編譯安裝nginx


vim /etc/ansible/roles/install/tasks/main.yml

  • include: copy.yml
  • include: install.yml
    //在install角色下建立一個總的main.yml檔案,呼叫copy.yml和install.yml
    ansible-playbook 手工編譯安裝nginx


vim /etc/ansible/install.yml

  • hosts: all
    remote_user: root
    gather_facts: True
    roles:
    • common
    • install
      //在/etc/ansible/目錄下建立nginx安裝劇本nginx_install.yml呼叫roles下的common和install兩個角色
      ansible-playbook 手工編譯安裝nginx


至此我們手工編譯安裝nginx的playbook已經編寫完成。
ansible-playbook nginx_install.yml --syntax -check//檢查一下指令碼中的語法
ansible-playbook 手工編譯安裝nginx
沒有問題,ansible-playbook nginx_install.yml 執行劇本
然後去兩臺被管理端伺服器檢視nginx是否成功開啟
systemctl status nginx.service
ansible-playbook 手工編譯安裝nginx
至此通過劇本實現手工編譯安裝nginx完成