1. 程式人生 > >24.27/24.28 playbook安裝nginx

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要在