24.27/24.28 playbook安裝nginx
playbook安裝nginx
playbook實戰-nginx安裝1
針對自定製的原始碼安裝nginx
思路:先在一臺機器上編譯安裝好nginx、打包,然後再用ansible去下發
cd /etc/ansible 進入ansible配置檔案目錄
mkdir nginx_install 建立一個nginx_install的目錄,方便管理
cd nginx_install
mkdir -p roles/{common,install}/{handlers,files,meta,tasks,templates,vars}
說明:roles目錄下有兩個角色,common為一些準備操作,install為安裝nginx的操作。每個角色下面又有幾個目錄,handlers下面是當發生改變時要執行的操作,通常用在配置檔案發生改變,重啟服務。files為安裝時用到的一些檔案,meta為說明資訊,說明角色依賴等資訊,tasks裡面是核心的配置檔案,templates通常存一些配置檔案,啟動指令碼等模板檔案,vars下為定義的變數
playbook實戰-nginx安裝2
需要事先準備好安裝用到的檔案,具體如下:
在一臺機器上事先編譯安裝好nginx,配置好啟動指令碼,配置好配置檔案
安裝好後,我們需要把nginx目錄打包,並放到/etc/ansible/nginx_install/roles/install/files/下面,名字為nginx.tar.gz
啟動指令碼、配置檔案都要放到/etc/ansible/nginx_install/roles/install/templates下面
cd /etc/ansible/nginx_install/roles
定義common的tasks,nginx是需要一些依賴包的
vim ./common/tasks/main.yml //內容如下
- name: Install initializtion require software
yum: name={{ item }} state=installed
with_items:
- zlib-devel
- pcre-devel
playbook實戰-nginx安裝3
定義變數
vim /etc/ansible/nginx_install/roles/install/vars/main.yml //內容如下
nginx_user: www
nginx_port: 80
nginx_basedir: /usr/local/nginx
首先要把所有用到的文件拷貝到目標機器
vim /etc/ansible/nginx_install/roles/install/tasks/copy.yml //內容如下
- name: Copy Nginx Software
copy: src=nginx.tar.gz dest=/tmp/nginx.tar.gz owner=root group=root
- name: Uncompression Nginx Software
shell: tar zxf /tmp/nginx.tar.gz -C /usr/local/
- name: Copy Nginx Start Script
template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755
- name: Copy Nginx Config
template: src=nginx.conf dest={{ nginx_basedir }}/conf/ owner=root group=root mode=0644
playbook實戰-nginx安裝4
接下來會建立使用者,啟動服務,刪除壓縮包
vim /etc/ansible/nginx_install/roles/install/tasks/install.yml //內容如下
- name: Create Nginx User
user: name={{ nginx_user }} state=present createhome=no shell=/sbin/nologin
- name: Start Nginx Service
shell: /etc/init.d/nginx start
- name: Add Boot Start Nginx Service
shell: chkconfig --level 345 nginx on
- name: Delete Nginx compression files
shell: rm -rf /tmp/nginx.tar.gz
playbook實戰-nginx安裝5
再建立main.yml並且把copy和install呼叫
vim /etc/ansible/nginx_install/roles/install/tasks/main.yml //內容如下
- include: copy.yml
- include: install.yml
到此兩個roles:common和install就定義完成了,接下來要定義一個入口配置檔案(命令列執行時所寫的檔案)
vim /etc/ansible/nginx_install/install.yml //內容如下
---
- hosts: testhost
remote_user: root
gather_facts: True
roles:
- common
- install
執行: ansible-playbook /etc/ansible/nginx_install/install.yml
例項:
1.
[root@axinlinux-01 ~]# cd /etc/ansible/
[root@axinlinux-01 ansible]# ls
ansible.cfg create_user.yml handlers.yml hosts roles test.yml when.yml while.retry while.yml
[root@axinlinux-01 ansible]# mkdir nginx_install
[root@axinlinux-01 ansible]# cd nginx_install/
[root@axinlinux-01 nginx_install]# mkdir -p roles/{common,install}/{handlers,files,mete,tasks,templates,vars} #在roles目錄下建立了common和install目錄,在這兩個目錄下又建立了後面的這些目錄
[root@axinlinux-01 nginx_install]# ls
roles
[root@axinlinux-01 nginx_install]# ls roles/
common install
[root@axinlinux-01 nginx_install]# ls roles/install/
files handlers mete tasks templates vars
files是我們要拷貝的一些檔案。把要拷貝到其他機器上的檔案放到這個目錄下來
handlers是對應一些handlers放到這下面來
mete是說明資訊,可以留空
tasks主要的核心任務是什麼
templates模板。比如我們安裝nginx,針對不同的伺服器有的是4核的有的是8核的,針對4核的啟動的子程序就是4,針對8核的子程序就是8。根據系統的不同,提供不同的變數在裡面
vars是定義的一些變數
2.
[root@axinlinux-01 nginx_install]# cd /usr/local/ #我們已經有nginx了,就不需要在原始碼安裝了
[root@axinlinux-01 local]# tar czvf nginx.tar.gz --exclude "nginx.conf" --exclude "vhosts" nginx/
#將nginx目錄打包,過濾出(--clude)nginx.conf和vhosts目錄,暫時不打包這兩個
[root@axinlinux-01 local]# mv nginx.tar.gz /etc/ansible/nginx_install/roles/install/files/ #將打包好的nginx放到files下
[root@axinlinux-01 local]# cp nginx/conf/nginx.conf /etc/ansible/nginx_install/roles/install/templates/ #將nginx.conf放到templates下
[root@axinlinux-01 local]# cp /etc/init.d/nginx /etc/ansible/nginx_install/roles/install/templates/ #將啟動指令碼放到templates下
vhosts暫時先不拷貝了,後面有專門搞配置的一章
[root@axinlinux-01 local]# cd /etc/ansible/nginx_install/roles/common/
[root@axinlinux-01 common]# vim tasks/main.yml #在這不像在playbook裡直接寫tasks一行,後面就直接跟模組名就可以了。但是在這,這種playbook是由目錄組成的很大的一個小級別一個小級別的,他不是一個整體。要想將這個整體串聯起來,就要建立對應的上面tasks、handlers等等這些目錄,在這些目錄下面呢,去建立main.yml這個檔案,那麼他會自動去找。那麼這下面就是你要執行的一些東西了。在這裡就是啟動nginx時,所依賴的包和庫等等
- name: Install initializtion require software
yum: name={{ item }} state=installed #模組yum,item就是變數下面的兩個,然後就是安裝
with_items:
- zlib-devel #需要安裝的
- pcre-devel #需要安裝的
- name: Install initializtion require software
yum: name={{ item }} state=installed
with_items:
- zlib-devel
- pcre-devel
注意:
以上這裡,在最後執行的過程當中(ansible-playbook),出現報錯為yum安裝的包有問題(可能是yum迴圈的問題)。可以換一種方法,以下:
[root@axinlinux-01 common]# vim tasks/main.yml
- name: Install initializtion require software
yum: name="pcre-devel,zlib-devel" state=installed #不使用迴圈,直接安裝這兩個。使用逗號分隔
3.
[root@axinlinux-01 common]# vim /etc/ansible/nginx_install/roles/install/vars/main.yml
nginx_user: www #根據機器環境的不同,我們可以去定義它不同的值。比如web1是www,web2是apache
nginx_port: 80 #還可以去定義port,因為有的是80,有的是8080
nginx_basedir: /usr/local/nginx
nginx_user: www
nginx_port: 80
nginx_basedir: /usr/local/nginx
vim /etc/ansible/nginx_install/roles/install/tasks/copy.yml #相當於子配置檔案(主配置檔案是main.yml),將所需文件拷貝到目標機器
- name: Copy Nginx Software
copy: src=nginx.tar.gz dest=/tmp/nginx.tar.gz owner=root group=root #copy模組,拷貝nginx的tar包。不需要寫絕對路徑,因為能自動在files目錄下找
- name: Uncompression Nginx Software
shell: tar zxf /tmp/nginx.tar.gz -C /usr/local/ #shell模組,用來解壓
- name: Copy Nginx Start Script
template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755 #拷貝啟動指令碼
- name: Copy Nginx Config
template: src=nginx.conf dest={{ nginx_basedir }}/conf/ owner=root group=root mode=0644 #拷貝配置檔案
templates
- name: Copy Nginx Software
copy: src=nginx.tar.gz dest=/tmp/nginx.tar.gz owner=root group=root
- name: Uncompression Nginx Software
shell: tar zxf /tmp/nginx.tar.gz -C /usr/local/
- name: Copy Nginx Start Script
template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755
- name: Copy Nginx Config
template: src=nginx.conf dest={{ nginx_basedir }}/conf/ owner=root group=root mode=0644
它是一個模組功能,與copy不同的是他的文字檔案採用了jinga2語法,注意:template只能在palybook中使用。
4.
vim /etc/ansible/nginx_install/roles/install/tasks/install.yml #這個實際上是總的.yml
- name: Create Nginx User
user: name={{ nginx_user }} state=present createhome=no shell=/sbin/nologin #user模組。nginx_user變數,在第三步驟vars/main.yml定義的。也就是使用www使用者。不需要建立使用者家目錄
- name: Start Nginx Service
shell: /etc/init.d/nginx start
- name: Add Boot Start Nginx Service
shell: chkconfig --level 345 nginx on #開啟啟動。第一次的話用chkconfig,不要用systemctl
- name: Delete Nginx compression files
shell: rm -rf /tmp/nginx.tar.gz
- name: Create Nginx User
user: name={{ nginx_user }} state=present createhome=no shell=/sbin/nologin
- name: Start Nginx Service
shell: /etc/init.d/nginx start
- name: Add Boot Start Nginx Service
shell: chkconfig --level 345 nginx on
- name: Delete Nginx compression files
shell: rm -rf /tmp/nginx.tar.gz
5.
[root@axinlinux-01 common]# vim /etc/ansible/nginx_install/roles/install/tasks/main.yml #呼叫這兩個
- include: copy.yml
- include: install.yml
[root@axinlinux-01 common]# vim /etc/ansible/nginx_install/install.yml
---
- hosts: axinlinux-02 #使用一個機器來,可以寫testhost(主機組)
remote_user: root
gather_facts: True
roles:
- common
- install
---
- hosts: testhost
remote_user: root
gather_facts: True
roles:
- common
- install
[root@axinlinux-02 ~]# yum remove nginx #解除安裝之前yum的ngixn
[root@axinlinux-02 ~]# rm -f /etc/init.d/nginx
[root@axinlinux-01 common]# ansible-playbook /etc/ansible/nginx_install/install.yml
[root@axinlinux-02 ~]# ps aux |grep nginx #檢查02機器,檢視是不是我們配置檔案的nginx的程序
root 12454 0.0 0.0 45700 1132 ? Ss 21:14 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody 12455 0.0 0.2 48192 3772 ? S 21:14 0:00 nginx: worker process
nobody 12456 0.0 0.2 48192 4028 ? S 21:14 0:00 nginx: worker process
root 12651 0.0 0.0 112676 988 pts/0 S+ 21:15 0:00 grep --color=auto nginx
[root@axinlinux-02 ~]# cat /usr/local/nginx/conf/nginx.conf
總結:
我們在最後執行ansible-playbook /etc/ansible/nginx_install/install.yml的時候,總的有一個.yml的檔案吧,他是一個總入口的檔案。那麼他會指定那個機器去做接下來的操作。同時他也會定義一個roles,roles對應一些子目錄(可以理解為子playbook指令碼)。
roles裡有common和install:
common裡有tasks/main.yml,不管執行什麼,他都會去tasks裡找,去安裝那兩個依賴的包
install裡也有tasks/main.yml,他連線copy.yml和install.yml,這兩個.yml要在