本節索引:
一、YAML語法簡介
二、Ansible中的劇本Playbook用法
三、Playbook中handler的使用
四、Playbook中變量的使用
playbook是由一個或多個”play”組成的列表
play的主要功能在于將事先歸并為一組的主機裝扮成事先通過ansibe中的task定義好的角色。從根本上來
講,所謂task無非是調用ansible的module。將多個play組織在一個playbook中,即可讓它們聯同起來按事
先編排的機制運行。
Playbook采用YAML語言編寫每一個Ansible的Playbook都是一個YAML格式的文件,因此要學習編寫劇
本(playbook),我們先來了解YAML語法的基本用法
一、YAML介紹:
YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其他多種語言,包括:XML、
C語言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年在首次發表了這種
語言,另外Ingy d?t Net與Oren Ben-Kiki也是這語言的共同設計者
YAML Ain’t Markup Language,即YAML不是XML。不過,在開發的這種語言時,YAML的意
思其實是:”Yet Another Markup Language”(仍是一種標記語言)
特性:
YAML的可讀性好
YAML和腳本語言的交互性好
YAML使用實現語言的數據類型
YAML有一個一致的信息模型
YAML易于實現
YAML可以基于流來處理
YAML表達能力強,擴展性好
更多的內容及規范參見http://www.yaml.org
YAML語法格式:
1.在單一檔案中,可用連續三個連字號(——)區分多個檔案。另外,還有選擇性的連續三個點號
( … )用來表示檔案結尾
2.次行開始正常寫Playbook的內容,一般建議寫明該Playbook的功能
3.使用#號注釋代碼
4.縮進必須是統一的,不能空格和tab混用
5.縮進的級別也必須是一致的,同樣的縮進代表同樣的級別,程序判別配置的級別是通過縮進結
合換行來實現的
6.YAML文件內容和Linux系統大小寫判斷方式保持一致,是區別大小寫的,k/v的值均需大小寫敏
感
7.k/v的值可同行寫也可換行寫。同行使用:分隔
8.v可是個字符串,也可是另一個列表
9.一個完整的代碼塊功能需最少元素需包括 name: task
10.一個name只能包括一個task
11.YAML文件擴展名通常為yml或yaml
YAML語法簡介:
[列表]
List:列表,其所有元素均使用“-”打頭
示例:
# A list of tasty fruits
– Apple
– Orange
– Strawberry
– Mango
[字典]
Dictionary:字典,通常由多個key與value構成
示例:
—
# An employee record
name: Example Developer
job: Developer
skill: Elite
也可以將key:value放置于{}中進行表示,用,分隔多個key:value
示例:
—
# An employee record
{name: Example Developer, job: Developer, skill: Elite}
二、劇本Playbook
Playbook核心元素:
Hosts:執行的遠程主機列表
Tasks:任務列表
Varniables:內置變量或自定義變量在playbook中調用
Templates:模板,可替換模板文件中的變量并實現一些簡單邏輯的文件
Handlers:和notify結合使用,由特定條件觸發的操作,滿足條件方才執行,否則不執行
tags:標簽,指定某條任務執行,用于選擇運行playbook中的部分代碼。ansible具有冪等性。因此
會自動跳過沒有變化的部分。此時,如果確信其沒有變化,就可以通過tags跳過此些代碼片段
下圖展示的是Playbook的工作機制:
Hosts:
作用:playbook中的每一個play的目的都是為了讓某個或某些主機以某個指定的用戶
身份執行任務。hosts用于指定要執行指定任務的主機,須事先定義在主機清單中
可以是如下形式:
one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1.*
websrvs:dbsrvs ????????????? 兩個組的并集
websrvs:&dbsrvs ? ? ? ? ? ? 兩個組的交集
webservers:!dbsrvs 在websrvs組,但不在dbsrvs組
示例:
– hosts: websrvs:dbsrvs
remote_user:
作用:可用于Host和task中。也可以通過指定其通過sudo的方式在遠程主機上執行任務,
其可用于play全局或某任務;此外,甚至可以在sudo時使用sudo_user指定sudo時切換的
用戶
– hosts: websrvs
? remote_user: root
? tasks:
??? – name: test connection
????? ping:
????? remote_user: magedu
????? sudo: yes 默認sudo為root
????? sudo_user:wang sudo為wang
tasks:
作用:任務列表
格式:module: arguments
注意:shell和command模塊后面跟命令,而非key=value
檢查playbook:
ansible-playbook -C file.yml
運行playbook的方式:
??? ansible-playbook <filrname.yml> …[options]
??? options:
–check????????????????????? 只檢測可能會發生的改變,但不真正的操作
–list-hosts??????????????? 列出運行任務的主機
–limit?????? 主機列表 ????? 只針對主機列表中的主機執行
-v,-vv,-vvv???????????????? 顯示詳細過程
一個最簡單的Playbook需包含的基礎組件有host、remote_user、tasks
示例1:
vim http.yml
—
– hosts: websrvs
? remote_user: root
? tasks:
??? – name: create new file
????? file: name=/data/newfile state=touch
??? – name: create new file
????? user: name=test2 system=yes shell=/sbin/nologin
??? – name: install package
????? yum: name=httpd
??? – name: copy index
????? copy: src=/var/www/html/index.html dest=/var/www/html/
??? – name: start service
????? service: name=httpd state=started enabled=yes
tags標簽
task任務也可以通過”tags”打標簽,而后可在ansible-playbook命令上使用-t指定進行調用
示例2:使用tags
vim http.yml
—
– host: websrvs
? remote_user: root
? tasks:
??? – name: install httpd package
????? yum: name=httpd
????? tags: inshttpd
??? – name: copy conf file
????? copy: src=files/httpd.conf dest=/etc/httpd/conf/? backup=yes
????? tags: cphttpd
??? – name: start service
????? service: name=httpd state=startd enable=yes
????? tags: rshttpd
ansible-playbook -t rshttpd httpd.yml??????????? 單獨執行rshttp
注:多個動作可共用一個tags標簽
三、Playbook中handler的使用
由于Ansible冪等性的特性,有時前一個task發生了變化,后續的task無變化并不會重新執行,
但后續的task卻可能受前一個task變化而影響。使用hanlder和notify即可解決此問題,handler
用于當關注的資源發生變化時,才會采取一定的操作。在notify中列出的操作稱為handler,
也即notify中調用handler中定義的操作
示例:
vim http.yml
—
– host: websrvs
? remote_user: root
? tasks:
??? – name: install httpd package
????? yum: name=httpd
??? – name: copy conf file
????? copy: src=files/httpd.conf dest=/etc/httpd/conf/? backup=yes
??? – name: start service
????? service: name=httpd state=startd enable=yes
vim /files/httpd.conf
Listen 8080
ansible-playbook http.yml
此時無法重啟服務,端口仍為80
vim http.yml
—
– host: websrvs
? remote_user: root
? tasks:
??? – name: install httpd package
????? yum: name=httpd
??? – name: copy conf file
????? copy: src=files/httpd.conf dest=/etc/httpd/conf/? backup=yes
????? notify: restart service
??? – name: start service
????? service: name=httpd state=startd enable=yes
? handlers:
??? – name: restart service
????? service: name=httpd state=restarted
由于httpd.conf發生了變化,觸發了notify,執行相應的handler操作,httpd服務重啟后
監聽端口變為8080
四、Playbook中變量的使用
變量名:僅能由字母、數字和下劃線組成,且只能以字母開頭
變量來源:
1.ansible all -m setup? 遠程主機的所有變量都可直接調用
2.在/etc/ansible/hosts中定義
普通變量:主機組中主機單獨定義,優先級高于公共變量
host分組變量:針對主機組中所有主機定義統一變量
3.通過命令行指定變量,優先級最高
例如:ansible-playbook –e varname=value
4.在playbook中定義
vars:
? – var1: value1
? – var2: value2
5.在role中定義
變量定義:key=value
示例:http_port=80
變量調用方式:
通過{{ variable_name }} 調用變量,且變量名前后必須有空格,有時用”{{ variable_name }}”才生效
變量調用優先級:
命令行-e > playbook定義 > hosts普通變量 > host分組變量
示例1:命令行變量賦值
vim app.yml
—
– hosts: appsrvs
? remote_user: root
? tasks:
??? – name: install package
????? yum: name={{ pkname }}
??? – name: start service
????? service: name={{ pkname }} state=started enabled=yes
變量賦值并執行:
ansible-playbook -e ‘pkname=vsftpd’ app.yml?????
示例2:playbook中賦值變量
vim app.yml
—
– hosts: appsrvs
? remote_user: root
? vars:
??? – pkname1: httpd
??? – pkname2: vsftpd
? tasks:
??? – name: install package
????? yum: name={{ pkname1 }}
??? – name: install package
????? yum: name={{ pkname2 }}
ansible-playbook app.yml
示例3:hosts文件中定義普通變量
vim /etc/ansible/hosts
192.168.30.101 httpd_port=81
192.168.30.102 httpd_port=82
vim hostname.yml
—
– hosts: websrvs
? remote_user: root
? tasks:
??? – name: set hostname
????? hostname: name=www{{httpd_port}}.magedu.com
ansible-playbook -C hostname.yml
示例4:hosts文件中定義分組變量
vim /etc/ansible/hosts
[websrv:vars]
nodename=www
domainname=wxlinux.com
vim hostname2.yml
—
– hosts: websrvs
? remote_user: root
? tasks:
??? – name: set hostname
????? hostname: name={{nodename}}{{http_port}}.{{domainname}}
ansible-playbook hostname.yml
示例5:引用系統自帶變量
ansible all -m setup |grep? ansible_fqdn???? 查看系統自帶變量
vim var.yml
—
– hosts: websrvs
? remote_user: root
? tasks:
??? – name: create log file
????? file: name=/data/{{ ansible_fqdn }}.log state=touch
示例6:定義變量到一個文件中
vim vars.yml
var1: httpd
var2: vsftpd
vim testvar.yml
—
– hosts: websrvs
? remote_user: root
? vars_files:
??? – vars.yml
? tasks:
??? – name: install package
????? yum: name={{ var1 }}
??? – name: create file
????? file: name=/data/{{ var2 }}.log state=touch
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/99817