前言
截止目前已經寫了《Ansible基礎認識及安裝使用詳解(一)--技術流ken》,《Ansible常用模塊介紹及使用(二)--技術流ken》《Ansible劇本介紹及使用演示(三)--技術流ken》以及《Git介紹及常用操作演示(一)--技術流ken》,《Gitlab在linux/windows中免密使用(二)--技術流ken》等五篇有關ansible和git系列文章,相信看過我的這幾篇博客的小伙伴已經充分掌握了如何使用ansible劇本完成自動化批量管理,以及使用git實現持續化。現在我們來做一個實際項目,來加深我們對這兩個非常重要的工具的理解吧。
項目需求
為了增加項目的難度,特地要求使用role,以及templates來完成該項目。
1. 在gitlab中創建一個項目 nginxinstall
2. 編寫playbook,實現一鍵部署nginx、部署一個靜態測試頁、測試部署結果
要求:
部署nginx
端口:83
運行身份:root
設置並發連接數:2048
主機名:當前節點的主機名
根目錄:/vaw/www/html
其他要求:
部署兩個以上節點
用role
用templates
3. 將寫好的playbook保存到gitlab倉庫中
項目實現1
為了讓大家更方便閱讀,上述項目我分為三個部分,每個部分完成一個要求,現在開始吧。
1. 在gitlab中創建一個項目 nginxinstall
這個應該對我們來說很簡單了,所以我就不再細說
第一步:打開我們gitlab的web頁面添加項目即可
點擊create project即可完成項目的創建

roles使用詳解
role介紹
roles 用於層次性、結構化地組織playbook。
roles 能夠根據層次型結構自動裝載變量文件、tasks以及handlers等。
要使用roles只需要在playbook中使用include指令即可。
簡單來講,roles就是通過分別將變量(vars)、文件(file)、任務(tasks)、模塊(modules)及處理器(handlers)放置於單獨的目錄中,並可以便捷地include它們的一種機制。角色一般用於基於主機構建服務的場景中,但也可以是用於構建守護進程等場景中。
創建 roles 的步驟
(1) 創建以包含roles命名的目錄,例如/tmp/ken/roles/;
(2) 在roles目錄中分別創建以各角色名稱命名的目錄,如nginx等
(3) 在每個角色命名的目錄中(及nginx中)分別創建files、handlers、meta、tasks、templates和vars目錄;用不到的目錄可以創建為空目錄,也可以不創建例如:mkdir /tmp/ken/roles/nginx/{files,handlers,meta,tasks,templates,vars};
(4) 在roles同級目錄中創建playbook文件,調用各角色例如:touch /tmp/ken/palybook.yml;
roles 內各目錄中可用的文件
tasks目錄:至少應該包含一個名為main.yml的文件,其定義了此角色的任務列表;此文件可以使用include包含其它的位於此目錄中的task文件;
files目錄:存放由copy或script等模塊調用的文件;
templates目錄:template模塊會自動在此目錄中尋找j2模板文件;
handlers目錄:此目錄中應當包含一個main.yml文件,用於定義此角色用到的各handler;在handler中使用include包含的其它的handler文件也應該位於此目錄中;
vars目錄:應當包含一個main.yml文件,用於定義此角色用到的變量;
meta目錄:應當包含一個main.yml文件,用於定義此角色的特殊設定及其依賴關系;ansible 1.3及其以后的版本才支持;
default目錄:為當前角色設定默認變量時使用此目錄;應當包含一個main.yml文件。
項目實現2
第一步:創建目錄
可以選擇全部創建,也可以只創建你需要的,沒有用到的為空即可
注意劇本和roles都在ken下
[root@ken ~]# mkdir /tmp/ken/roles/nginx/{tasks,handlers,files,vars,templates,meta,default} -pv
第二步:編輯hosts文件
即把需要管理的節點ip寫進去
[root@ken ken]# vim /etc/ansible/hosts [ken] 10.220.5.139 10.220.5.138
第三步:編輯roles下面的tasks文件
寫入如下信息
[root@ken ken]# cat /tmp/ken/roles/nginx/tasks/main.yml - yum: name=nginx state=present - template: src=/tmp/ken/roles/nginx/templates/nginx.j2 dest=/etc/nginx/nginx.conf
- service: name=nginx state=restarted
- copy: src=/tmp/ken/roles/nginx/files/index.html dest=/var/www/html/index.html
第四步:准備測試文件
[root@ken ~]# echo "test for static web"> /tmp/ken/roles/nginx/files/index.html
第五步:編輯vars變量文件
[root@ken ~]# cat /tmp/ken/roles/nginx/vars/main.yml port: 83 user: root conn: 2048 hostname: ken dire: /var/www/html
第六步;編輯templates模版文件
把nginx的配置文件復制到template目錄下並改名為nginx.j2,結尾一定要是j2
[root@server ken]# cp /etc/nginx/nginx.conf /tmp/ken/roles/nginx/templates/nginx.j2
需要把修改的部分更改為變量
[root@server roles]# grep -v -E "^#|^$" nginx/templates/nginx.j2 user {{ user }}; #定義成變量 worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; include /usr/share/nginx/modules/*.conf; events { worker_connections {{ conn }}; #變量 } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # include /etc/nginx/conf.d/*.conf; server { listen {{ port }}; #變量 server_name {{ hostname }}; #變量 root {{ dire }}; #變量 index index.html; # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } }
第七步:在roles同級目錄下創建劇本
一定要和roles在同一個目錄下創建
[root@server ken]# cd /tmp/ken/ [root@server ken]# ls hosts roles [root@server ken]# vim test.yml [root@server ken]# cat test.yml - hosts: all roles: - nginx #即roles下面的一級目錄
第八步:執行劇本
[root@server ken]# ansible-playbook test.yml PLAY [all] ************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************** ok: [172.20.10.7] ok: [172.20.10.2] TASK [nginx : yum] ****************************************************************************************************** ok: [172.20.10.2] ok: [172.20.10.7] TASK [nginx : template] ************************************************************************************************* ok: [172.20.10.7] changed: [172.20.10.2] TASK [nginx : service] ************************************************************************************************** changed: [172.20.10.7] changed: [172.20.10.2] TASK [nginx : copy] ***************************************************************************************************** changed: [172.20.10.2] changed: [172.20.10.7] PLAY RECAP ************************************************************************************************************** 172.20.10.2 : ok=5 changed=3 unreachable=0 failed=0 172.20.10.7 : ok=5 changed=2 unreachable=0 failed=0
第九步:查看是否執行成功
直接訪問節點頁面即可
因為我們更改了端口為83,不再是默認端口80了,所以訪問頁面時需要指定83端口
測試成功


項目實現3
這一步是將我們寫好的playbook保存在倉庫中,其實嚴格來做的話這一步一定是在項目2開始之前就要做的,我們需要在工作目錄之下來寫這些文件,文件更改之后上傳即可。
第一步:打開gitlab找到ssh地址

第二步:下載倉庫內容
[root@ken kl]# git clone git@10.220.5.137:webs/nginxinstall.git [root@ken kl]# ls nginxinstall
第三步:進入nginxinstall項目工作目錄下
查看git幾個區 的狀態
[root@ken kl]# cd nginxinstall/ [root@ken nginxinstall]# ls -a . .. .git [root@ken nginxinstall]# git status # On branch master # # Initial commit # nothing to commit (create/copy files and use "git add" to track)
第四步:復制文件到該目錄下並提交
[root@ken nginxinstall]# cp /tmp/ken -a ./ [root@ken nginxinstall]# ls ken [root@ken nginxinstall]# git status # On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # ken/ nothing added to commit but untracked files present (use "git add" to track) [root@ken nginxinstall]# git add ken #加入到緩存區 [root@ken nginxinstall]# git commit -m "v1: nginx" #提交到倉庫 [master (root-commit) 78bc6c3] v1: nginx 8 files changed, 196 insertions(+) create mode 100644 ken/hosts create mode 100644 ken/roles/nginx/files/index.html create mode 100644 ken/roles/nginx/tasks/main.yml create mode 100644 ken/roles/nginx/template/nginx.conf create mode 100644 ken/roles/nginx/template/nginx.j2 create mode 100644 ken/roles/nginx/vars/main.yml create mode 100644 ken/test.retry create mode 100644 ken/test.yml
第五步:推送至遠程倉庫
[root@ken nginxinstall]# git push origin master Counting objects: 20, done. Compressing objects: 100% (10/10), done. Writing objects: 100% (19/19), 2.25 KiB | 0 bytes/s, done. Total 19 (delta 1), reused 0 (delta 0) To git@10.220.5.137:webs/nginxinstall.git 838ee6a..57ec0b9 master -> master
第六步:在web端查看推送結果
發現推送完成

