一、Playbook簡(jiǎn)介
創(chuàng)新互聯(lián)公司是專業(yè)的婁煩網(wǎng)站建設(shè)公司,婁煩接單;提供網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行婁煩網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
playbook配置文件使用YAML語(yǔ)法,具有簡(jiǎn)潔明了、結(jié)構(gòu)清晰等特點(diǎn)。playbook配置文件類似于shell腳本,是一個(gè)YAML格式的文件,用于保存針對(duì)特定需求的任務(wù)列表。上面介紹的ansible命令雖然可以完成各種任務(wù),但是當(dāng)配置一些復(fù)雜任務(wù)時(shí),逐條輸入就顯得效率非常低下了。更有效的方案是在playbook配置文件中放置所有的任務(wù)代碼,利用ansible-playbook命令執(zhí)行該文件,可以實(shí)現(xiàn)自動(dòng)化運(yùn)維。YAML文件的擴(kuò)展名通常為.yaml或.yml。
二、playbook的核心元素
playbook的核心元素包含:
- hosts:任務(wù)的目標(biāo)主機(jī),多個(gè)主機(jī)用冒號(hào)分隔,一般調(diào)用/etc/ansible/hosts中的分組信息。
- remote_user:遠(yuǎn)程主機(jī)上,運(yùn)行此任務(wù)的默認(rèn)身份為root。
- tasks:任務(wù),即定義的具體任務(wù),由模塊定義的操作列表。
- handlers:觸發(fā)器,類似tasks,只是在特定的條件下才會(huì)觸發(fā)的任務(wù)。某任務(wù)的狀態(tài)在運(yùn)行后為changed時(shí),可通過(guò)“notify”通知給相應(yīng)的handlers進(jìn)行觸發(fā)執(zhí)行。
- roles:角色,將hosts剝離出去,由tasks、handlers等所組成的一種特定的結(jié)構(gòu)集合。
三、playbook格式
playbook需要注意的事項(xiàng):
- playbook由YMAL語(yǔ)言編寫(xiě)。YAML參考了其他多種語(yǔ)言,包括:XML、C語(yǔ)言、Python、Perl等。MAL格式是類似于JSON的文件格式,便于人理解和閱讀,同時(shí)便于書(shū)寫(xiě)。
- 通過(guò)“-”來(lái)代表項(xiàng),通過(guò)冒號(hào) “ :”來(lái)分隔鍵和值,整個(gè)文件以“---”開(kāi)始并以“...”結(jié)束。
- 所有的“-”和“ : ”后面均由空格,而且要嚴(yán)格注意縮進(jìn)和對(duì)齊,否則語(yǔ)法可能能會(huì)報(bào)錯(cuò)。
- 每次在執(zhí)行playbook文件之前,一定要使用“-C”選項(xiàng)來(lái)進(jìn)行預(yù)測(cè)試。該選項(xiàng)會(huì)執(zhí)行一遍playbook文件,但不會(huì)對(duì)目標(biāo)主機(jī)進(jìn)行任何更改,若語(yǔ)法有錯(cuò)或目標(biāo)主機(jī)缺少某個(gè)文件,都將報(bào)錯(cuò)提示。
1、執(zhí)行簡(jiǎn)單的playbook文件:
[root@ansible ~]# grep -v ^# /etc/ansible/hosts | grep -v ^$ #查看hosts中的分組信息
[web1]
192.168.1.2
[web2]
192.168.1.3
[root@ansible ~]# vim /etc/ansible/a.yml #創(chuàng)建a.yml文件,寫(xiě)入以下內(nèi)容
---
- hosts: web1 #針對(duì)web1組中的操作
remote_user: root #遠(yuǎn)端執(zhí)行用戶身份為root
tasks: #任務(wù)列表
- name: adduser #任務(wù)名稱
user: name=user1 state=present #執(zhí)行user模塊,創(chuàng)建用戶
tags: #創(chuàng)建tag標(biāo)簽
- aaa #tag標(biāo)簽為aaa
- name: addgroup #任務(wù)名稱
group: name=root system=yes #執(zhí)行g(shù)roup模塊,創(chuàng)建組
tags: #創(chuàng)建tag標(biāo)簽
- bbb #tag標(biāo)簽為bbb
- hosts: web2 #針對(duì)web2組中的操作
remote_user: root #遠(yuǎn)端執(zhí)行用戶身份為root
tasks: #任務(wù)列表
- name: copy file to web #任務(wù)名稱
copy: src=/etc/passwd dest=/home #執(zhí)行copy模塊,復(fù)制文件
tags: #創(chuàng)建tag標(biāo)簽
- ccc #tag標(biāo)簽為ccc
...
我這里編寫(xiě)的playbook文件如下:
playbook文件定義的任務(wù)需要通過(guò)ansible-playbook命令進(jìn)行調(diào)用并執(zhí)行,ansible-playbook命令用法如下:
[root@ansible ~]# ansible-playbook [ option ]/etc/ansible/a.yml
其中option中的功能包括:
* --syntax-check:檢測(cè)yaml文件的語(yǔ)法。
* -C:預(yù)測(cè)試,不會(huì)改變目標(biāo)主機(jī)的任何設(shè)置。
* --list-tasks:列出yaml文件的任務(wù)列表。
* --list-hosts:列出yaml文件影響的主機(jī)列表。
* --list-tags:列出yaml文件中的標(biāo)簽。
* -t TAGS:表示只執(zhí)行指定標(biāo)簽的任務(wù)。
* --skip-tags=SKIP_TAGS:表示出了指定標(biāo)簽的任務(wù),執(zhí)行其他任務(wù)。
* --start-at-task=START_AT:從指定任務(wù)開(kāi)始往下運(yùn)行。
執(zhí)行a.yml文件的示例如下:
[root@ansible ~]# ansible-playbook --syntax-check /etc/ansible/a.yml #語(yǔ)法檢測(cè)
playbook: /etc/ansible/a.yml #表示沒(méi)有報(bào)錯(cuò)
[root@ansible ~]# ansible-playbook -C /etc/ansible/a.yml #對(duì)a.yml進(jìn)行預(yù)測(cè)試
.................#省略部分內(nèi)容
192.168.1.2 : ok=3 changed=1 unreachable=0 failed=0
192.168.1.3 : ok=2 changed=1 unreachable=0 failed=0
#返回結(jié)果表示沒(méi)有錯(cuò)誤,全部可以執(zhí)行成功。
[root@ansible ~]# ansible-playbook --list-hosts /etc/ansible/a.yml #列出a.yml文件中的主機(jī)
[root@ansible ~]# ansible-playbook --list-tasks /etc/ansible/a.yml #列出任務(wù)
[root@ansible ~]# ansible-playbook --list-tags /etc/ansible/a.yml #列出標(biāo)簽
[root@ansible ~]# ansible-playbook /etc/ansible/a.yml #執(zhí)行任務(wù)
[root@ansible ~]# ssh 192.168.1.2 tail -1 /etc/passwd #確認(rèn)執(zhí)行結(jié)果
user1:x:1001:1001::/home/user1:/bin/bash
[root@ansible ~]# ssh 192.168.1.3 ls -ld /home/passwd
-rw-r--r--. 1 root root 2342 7月 23 16:06 /home/passwd
#一般情況先執(zhí)行“-C”命令進(jìn)行預(yù)測(cè)試,沒(méi)有問(wèn)題后再執(zhí)行.yml文件。
有一個(gè)在線的ansible-playbook語(yǔ)法檢測(cè)工具,可以更直觀的檢查出語(yǔ)法中的錯(cuò)誤,感興趣可以看一下:http://www.yamllint.com/
2、觸發(fā)器
需要觸發(fā)才能執(zhí)行的任務(wù),當(dāng)之前在tasks中的任務(wù)執(zhí)行成功后,若希望在此基礎(chǔ)上觸發(fā)其他任務(wù),這就需要定義handlers。例如,當(dāng)通過(guò)ansible的模塊對(duì)目標(biāo)主機(jī)的配置文件進(jìn)行修改之后,如果任務(wù)執(zhí)行成功,可以觸發(fā)一個(gè)觸發(fā)器,在觸發(fā)器中定義目標(biāo)主機(jī)的服務(wù)重啟操作,以便配置文件生效。handlers觸發(fā)器具有如下特點(diǎn):
- handlers是ansible提供的條件機(jī)制之一。handlers和task很類似,但是它只在被task通知的時(shí)候才會(huì)觸發(fā)執(zhí)行。
- handlers只會(huì)在所有任務(wù)執(zhí)行完成后執(zhí)行。而且即使被通知了很多次,它也只會(huì)執(zhí)行一次。
handlers觸發(fā)器的使用示例如下:
[root@ansible ~]# ssh 192.168.1.2 netstat -anpt | grep 80 #查詢1.2主機(jī)監(jiān)聽(tīng)的端口
tcp6 0 0 :::80 :::* LISTEN 94858/httpd
#可以看到是監(jiān)聽(tīng)80端口,現(xiàn)在通過(guò)腳本改為8080端口,并使其生效。
[root@ansible ~]# vim /etc/ansible/httpd.yml #編輯httpd.yml文件,寫(xiě)入以下內(nèi)容
---
- hosts: web1
remote_user: root
tasks:
- name: change port
command: sed -i 's/Listen\ 80/Listen\ 8080/g' /etc/httpd/conf/httpd.conf
notify: #配置觸發(fā)條件
- restart httpd server #完成該任務(wù)后調(diào)用名為“restart httpd server”的觸發(fā)器
handlers: #配置觸發(fā)器
- name: restart httpd server #指定觸發(fā)器名字,要和上面“notify”指定的觸發(fā)器名字一樣
service: name=httpd state=restarted #觸發(fā)任務(wù)為重啟httpd服務(wù)。
...
#編寫(xiě)完成后,保存退出即可。
[root@ansible ~]# ansible-playbook -C /etc/ansible/httpd.yml #進(jìn)行預(yù)測(cè)試。
[root@ansible ~]# ansible-playbook /etc/ansible/httpd.yml #執(zhí)行腳本。
[root@ansible ~]# ssh 192.168.1.2 netstat -anpt | grep 8080 #遠(yuǎn)端主機(jī)已經(jīng)運(yùn)行8080端口
tcp6 0 0 :::8080 :::* LISTEN 103594/httpd
3、角色
將多種不同的tasks的文件集中存儲(chǔ)在某個(gè)目錄下,則該目錄就是角色。角色一般存放在/etc/ansible/roles/目錄下,可通過(guò)ansible的配置文件來(lái)調(diào)整默認(rèn)的角色目錄,/etc/ansible/roles/目錄下有很多子目錄,其中每一個(gè)子目錄對(duì)應(yīng)一個(gè)角色,每個(gè)角色也有自己的目錄結(jié)構(gòu),結(jié)構(gòu)如下:
/etc/ansible/roles/為角色集合,該目錄下有自定義的各個(gè)子目錄:
- mariadb:MySQL角色。
- Apache:httpd角色。
- Nginx:Nginx角色。
- 每個(gè)角色的定義,以特定的層級(jí)目錄結(jié)構(gòu)進(jìn)行組織。以mariadb(mysql角色)為例:
- files:存放由copy或script等模塊調(diào)用的文件。
- templates:存放template模塊查找所需要的模板文件的目錄,如mysql配置文件模板。
- tasks:任務(wù)存放的目錄。
- handlers:存放相關(guān)觸發(fā)執(zhí)行的目錄。
- vars:變量存放的目錄。
- meta:用于存放此角色元數(shù)據(jù)。
- default:默認(rèn)變量存放的目錄,文件中定義了此角色使用的默認(rèn)變量。
上面的目錄中,tasks、handlers、vars、meta、default至少應(yīng)該包含一個(gè)main.yml文件,該目錄下也可以有其他.yml文件,但是需要在main.yml文件中用include指令將其他.yml文件包含進(jìn)來(lái)。
.
有了角色后,可以直接在yaml文件(playbook配置文件)中調(diào)用角色,示例如下:
---
- hosts: web1
remote_user: root
roles:
- mysql #調(diào)用角色名
- httpd #調(diào)用角色名
...
可以只調(diào)用一個(gè)角色,也可以調(diào)用多個(gè)角色,當(dāng)定義了角色后,用ansible-playbook PALYBOOK文件執(zhí)行即可。此時(shí)ansible會(huì)到角色集合的目錄(/etc/ansible/roles)去找mysql和httpd目錄,然后依次運(yùn)行mysql和httpd目錄下的所有代碼。
.
下面來(lái)個(gè)安裝及配置mariadb數(shù)據(jù)庫(kù)的實(shí)例:
需求分析:
- 要求被管理主機(jī)上自動(dòng)安裝mariadb,安裝完成后上傳提前準(zhǔn)備好的配置文件至遠(yuǎn)端主機(jī),重啟服務(wù),然后新建testdb數(shù)據(jù)庫(kù),并允許test用戶對(duì)其擁有所有權(quán)限。
- 被管理主機(jī)配置yum倉(cāng)庫(kù),自行配置,若被管理端可以連接互聯(lián)網(wǎng),那么直接將yum倉(cāng)庫(kù)指向互聯(lián)網(wǎng)即可。
開(kāi)始在ansible服務(wù)器上實(shí)施:
[root@ansible /]# mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
mkdir: 已創(chuàng)建目錄 "/etc/ansible/roles/mariadb"
mkdir: 已創(chuàng)建目錄 "/etc/ansible/roles/mariadb/files"
mkdir: 已創(chuàng)建目錄 "/etc/ansible/roles/mariadb/tasks"
mkdir: 已創(chuàng)建目錄 "/etc/ansible/roles/mariadb/handlers"
[root@ansible /]# cd /etc/ansible/roles/mariadb/tasks/ #切換至指定目錄
[root@ansible tasks]# ls
[root@ansible tasks]# vim main.yml #編寫(xiě)main.yml文件
---
- name: install mariadb
yum: name=mariadb-server state=present
- name: move config file
shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
- name: provide a new config file
copy: src=my.cnf dest=/etc/my.cnf
- name: reload mariadb
shell: systemctl restart mariadb
- name: create database testdb
shell: mysql -u root -e "create database testdb;grant all on testdb.* to 'test'@'192.168.1.%' identified by 'test123';flush privileges;"
notify:
- restart mariadb
...
#編寫(xiě)完畢,保存退出即可。
[root@ansible tasks]# cd ../handlers/ #切換至觸發(fā)器目錄
[root@ansible handlers]# vim main.yml #編寫(xiě)main.yml文件,寫(xiě)入以下內(nèi)容
---
- name: restart mariadb
service: name=mariadb state=restarted
...
#編寫(xiě)完畢,保存退出即可。
[root@ansible handlers]# cd ../files #進(jìn)入mariadb角色文件夾的files
[root@ansible files]# pwd
/etc/ansible/roles/mariadb/files
[root@ansible files]# ls #準(zhǔn)備好配置好的mysql數(shù)據(jù)庫(kù)配置文件,需要分發(fā)到遠(yuǎn)程主機(jī)的
my.cnf
[root@ansible files]# cd /etc/ansible/
[root@ansible ansible]# vim mariadb.yml #編寫(xiě).yml文件
---
- hosts: web
remote_user: root
roles:
- mariadb
...
##編寫(xiě)完畢,保存退出即可。
[root@ansible ansible]# ansible-playbook -C mariadb.yml #進(jìn)行預(yù)檢測(cè)
........................ #省略部分內(nèi)容
PLAY RECAP ***************************************************************************
192.168.1.2 : ok=3 changed=1 unreachable=0 failed=0
#返回結(jié)果表示沒(méi)問(wèn)題
[root@ansible ansible]# ansible-playbook mariadb.yml #執(zhí)行安裝
待安裝完成后,在遠(yuǎn)端主機(jī)上查看是否已經(jīng)創(chuàng)建了testdb數(shù)據(jù)庫(kù),并測(cè)試以test用戶登錄,自行測(cè)試吧。