Ansible使用介紹(二)YAML語法及Playbook

playbook是由一個或多個”play”組成的列表,play的主要功能在于將事先歸并為一組的主機裝扮成事先通過ansibe中的task定義好的角色。從根本上來講,所謂task無非是調用ansible的module。將多個play組織在一個playbook中,即可讓它們聯同起來按事先編排的機制運行。

本節索引:

一、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的工作機制:

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

http.yml

 

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標簽

tags2

 

 

三、Playbook中handler的使用

由于Ansible冪等性的特性,有時前一個task發生了變化,后續的task無變化并不會重新執行,

但后續的task卻可能受前一個task變化而影響。使用hanldernotify即可解決此問題,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

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

80802

 

四、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?????

vsftpd

 

示例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

palybook賦值變量

示例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

hostname2

vim hostname2.yml

– hosts: websrvs

? remote_user: root

 

? tasks:

??? – name: set hostname

????? hostname: name={{nodename}}{{http_port}}.{{domainname}}

 

ansible-playbook hostname.yml

hostname2 (3)

 

示例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

系統變量2

 

示例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

變量到文件中2

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/99817

(5)
wangxczwangxcz
上一篇 2018-05-30 21:21
下一篇 2018-05-30

相關推薦

欧美性久久久久