YAML語法 、 Ansible Playbook劇本 享怀、 Ansible變量

案例

鏈接

Playbook應用案例

1.1 問題

沿用練習二漓库,編寫Ansible Playbook劇本恃慧,使用Playbook完成自動化操作,具體要求如下:

  • 熟悉Playbook語法格式
  • 編寫Playbook管理系統(tǒng)賬戶
  • 編寫Playbook管理邏輯卷
  • 編寫Playbook管理軟件包

1.2 方案

Ansible ad-hoc可以通過命令行形式遠程管理其他主機渺蒿,適合執(zhí)行一些臨時性簡單任務(wù)痢士。另外還有一種遠程管理的方式叫Playbook,Ansible Playbook中文名稱叫劇本,它將經(jīng)常需要執(zhí)行的任務(wù)寫入一個文件茂装,這個文件就叫劇本怠蹂。

  • 劇本中可以包含多個任務(wù)
  • 劇本寫后,我們隨時根據(jù)劇本少态,執(zhí)行相關(guān)的任務(wù)命令
  • Playbook劇本要求按照YAML格式編寫
  • 適合執(zhí)行周期性經(jīng)常執(zhí)行的復雜任務(wù)

YAML是什么城侧?

  • YAML是一個可讀性高、用來表達數(shù)據(jù)序列的格式語言
  • YAML:YAML Ain't a Markup Language
  • YAML以數(shù)據(jù)為中心彼妻,重點描述數(shù)據(jù)的關(guān)系和結(jié)構(gòu)

YAML的格式要求如下:

  • "#"代表注釋嫌佑,一般第一行為三個橫杠(---)
  • 鍵值(key/value)對使用":"表示,數(shù)組使用"-"表示侨歉,"-"后面有空格
  • key和value之間使用":"分隔屋摇,":"后面必須有空格
  • 一般縮進由兩個或以上空格組成
  • 相同層級的縮進必須對齊,縮進代表層級關(guān)系
  • 全文不可以使用tab鍵
  • 區(qū)分大小寫
  • 擴展名為yml或者yaml
  • 跨行數(shù)據(jù)需要使用>或者|幽邓,其中|會保留換行符

YAML示例展示:

1)demo1

---
"詩仙": "李白"
或者
"詩仙": 
  "李白"

2)demo2

數(shù)組的例子

---
- "李白"
- "杜甫"
- "白居易"
- "唐僧"

3)demo3

使用一行表示數(shù)組的例子

---
"詩人": ["李白","杜甫","白居易"]

4)demo4

鍵值對和數(shù)組符合例子:

---
"詩人":
  - "李白"
  - "杜甫"
  - "白居易"

5)demo5

#復雜案例
---
- "詩人":
    - 唐代:
        - "李白"
        - "杜甫"
    - 宋代:
        - "蘇軾"
        - "李清照"

6)demo6

喜歡的電影

---   
- 芳華
- 戰(zhàn)狼
- 霸王別姬

7)demo7

人物描述

---   
- 姓名: 李白
  年齡: 61
  作品: 蜀道難
  好友: 汪倫

8)demo8

#跨行文本(計算機理解為一行)
---  
自我介紹:  >
  字太白,號青蓮居士,
  唐代詩人,祖籍隴西郡,
  今甘肅省平?jīng)鍪?

9)demo9

跨行文本(計算機理解為多行)

---  
自我介紹:  |
  字太白,號青蓮居士,
  唐代詩人,祖籍隴西郡,
  今甘肅省平?jīng)鍪?

10)demo10

注意-和:后面必須有空格炮温。

一張發(fā)票

--- 
發(fā)票編號: 34843
日期: 2028-12-12
商品:
    - 商品編號: BL394D
      描述: 足球
      價格: 100
    - 商品編號: BL4438H
      描述: 棒球
      價格: 200
稅費: 10.00
總價: 310.00
備注: >
  本次采購商品均
  屬于球類運動商品.   

11)demo11

錯誤日志

---
時間: 2028-10-01  15:01:42
用戶: ed
錯誤信息: 
    - 文件: nginx.conf
      行號: 23
      錯誤編碼: "0x3D5FF1"
    - 文件: test.php
      行號: 12
      錯誤代碼: "0xA4C51E"
警告信息: |
    你有兩個錯誤信息需要查看,
    一條是配置文件錯誤,
    一條是腳本語法錯誤,
    具體內(nèi)容參考錯誤信息.   

Playbook語法格式要求如下:

  • playbook采用YAML格式編寫
  • playbook文件中由一個或多個play組成
  • 每個play中可以包含:
  • hosts(主機)、tasks(任務(wù))牵舵、vars(變量)等元素組成
  • 使用ansible-playbook命令運行playbook劇本

步驟一:測試Playbook語法格式

1)編寫第一個Playbook(劇本)

hosts柒啤、tasks、name是關(guān)鍵詞(不可修改)棋枕,ping是模塊,調(diào)用不同模塊完成不同任務(wù)妒峦。

[root@control ansible]# vim ~/ansible/test.yml 
---
- hosts: all                                #hosts定義要遠程誰重斑?
  tasks:                                    #tasks定義遠程后要執(zhí)行的任務(wù)有哪些?
    - name: This is my first playbook      #name后面的具體內(nèi)容可以任意
      ping:
[root@control ansible]# ansible-playbook ~/ansible/test.yml

執(zhí)行效果如圖-1所示肯骇。

image

圖-1

2)定義多個主機和任務(wù)的劇本

hosts由一個或多個組或主機組成窥浪,逗號分隔祖很,tasks由一個或多個任務(wù)組成,多個任務(wù)按順序執(zhí)行漾脂,執(zhí)行ansible-playbook命令可以使用-f選項自定義并發(fā)量假颇。

[root@control ansible]# vim ~/ansible/test.yml 
- hosts: test,webserver
  tasks:
    - name: This is my first playbook     #name后面的內(nèi)容可以任意
      ping:
    - name: Run a shell command
      shell: touch ~/shell.txt
#hosts定義需要遠程哪些被管理主機,hosts是關(guān)鍵詞
#tasks定義需要執(zhí)行哪些任務(wù)骨稿,tasks是關(guān)鍵詞
#第一個任務(wù)調(diào)用ping模塊,該模塊沒有參數(shù)
#第二個任務(wù)調(diào)用shell模塊在被管理主機創(chuàng)建一個空文件~/shell.txt

[root@control ansible]# ansible-playbook ~/ansible/test.yml  -f 5
## 驗證:到node1笨鸡、node3、node4主機分別執(zhí)行命令ls /root/shell.txt查看是否有該文件

3)多個play的Playbook文件

[root@control ansible]# vim ~/ansible/test.yml
#第一個play劇目
---
- hosts: test
  tasks:
    - name: This is first play
      ping:
#第二個play劇目
- hosts: webserver
  tasks:
    - name: This is second play
      ping:

步驟二:Playbook應用案例

1)用戶管理坦冠,創(chuàng)建系統(tǒng)賬戶形耗、賬戶屬性、設(shè)置密碼(ansible-doc user)辙浑。

[root@control ansible]# vim ~/ansible/test_john.yml
---
- hosts: webserver
  tasks:
    - name: Add the user 'johnd' 
      user:
        name: johnd
        uid: 1040
        group: daemon
        password: "{{ '123' | password_hash('sha512') }}"
#hosts定義需要遠程的對象是webserver組激涤,hosts是關(guān)鍵詞
#tasks定義需要執(zhí)行的任務(wù),tasks是關(guān)鍵詞
# name是第一個任務(wù)的描述信息判呕,描述信息可以任意
# user是第一個任務(wù)需要調(diào)用的模塊倦踢,user下面的縮進內(nèi)容是給user模塊的參數(shù)
# name是需要創(chuàng)建的用戶名,uid是用戶ID號
# group是用戶屬于哪個基本組
# password是用戶的密碼侠草,密碼是123辱挥,密碼經(jīng)過sha512算法加密

[root@control ansible]# vim ~/ansible/user_james.yml
---
- hosts: webserver
  tasks:    
    - name:  Add 'james' with a bash shell
      user:
        name: james
        shell: /bin/bash
        groups: bin,adm
        password: "{{ '123' | password_hash('sha512') }}" 
#與上一個案例類似,groups指定用戶屬于哪些附加組.

[root@control ansible]# vim ~/ansible/user_johnd.yml
---
- hosts: webserver
  tasks:
    - name: Remove the user 'johnd'
      user:
        name: johnd
        state: absent
#刪除系統(tǒng)賬戶johnd梦抢,state的值設(shè)置為absent是刪除用戶

2)使用playbook管理邏輯卷

準備工作:給node2主機再添加一塊磁盤(以下實驗磁盤名稱僅為參考般贼,不要照抄)。

注意:請確保node2主機提前安裝了lvm2軟件包奥吩。

(ansible-doc parted哼蛆,ansible-doc lvg,ansible-doc lvol)

[root@control ansible]# vim ~/ansible/lvm.yml
---
- hosts: node2                            #遠程node2主機
  tasks:
    - name: Create a new primary partition with a size of 1GiB  #任務(wù)的描述信息
      parted:                                 #調(diào)用parted模塊進行分區(qū)         
          device: /dev/vdb                     #對/dev/vdb磁盤進行分區(qū)(磁盤名稱不要照抄)
          label: gpt                          #分區(qū)表類型為gpt霞赫,或msdos
          number: 1                           #分區(qū)編號(創(chuàng)建第幾個分區(qū))
          state: present                     #present是創(chuàng)建分區(qū),absent是刪除分區(qū)
          part_start: 1MiB                   #分區(qū)的開始位置(默認從最開始位置分區(qū))
          part_end: 1GiB                     #分區(qū)的結(jié)束位置(不寫就分到磁盤最后位置)
    - name: Create a volume group on top of /dev/vdb1     #第二個任務(wù)的描述信息
      lvg:                                  #調(diào)用lvg模塊,創(chuàng)建VG卷組
          vg: my_vg                          #要創(chuàng)建的卷組名稱
          pvs: /dev/vdb1                     #使用哪個分區(qū)創(chuàng)建PV
    - name: Create a logical volume of 512m          #第三個任務(wù)的描述信息
      lvol:                                 #調(diào)用lvol模塊創(chuàng)建LV
          vg: my_vg                          #使用哪個VG創(chuàng)建LV
          lv: my_lv                          #需要創(chuàng)建的LV名稱
          size: 512m                         #要創(chuàng)建的LV大小,可以不指定單位腮介,默認單位m

3)使用playbook管理軟件(ansible-doc yum)

RHEL或CentOS系統(tǒng)中的軟件有組包的概念,使用yum grouplist或者dnf grouplist可以查看組包的名稱端衰。

[root@control ansible]# vim ~/ansible/package.yml
---
- hosts: webserver                        #需要遠程的主機是誰
  tasks:                                   #定義劇本需要執(zhí)行的任務(wù)
    - name: Install a list of packages  #第一個任務(wù)的描述信息 
      yum:                                 #調(diào)用yum模塊安裝軟件
        name:                              #安裝軟件的名字叠洗,它的值有多個,使用數(shù)組-
          - httpd                          #安裝httpd軟件
          - mariadb                        #安裝mariadb軟件
          - mariadb-server                #安裝mariadb-server
    - name: install the 'RPM Development Tools' package group   #第二個任務(wù)的描述信息
      yum:                                  #調(diào)用yum模塊安裝軟件組包
        name: "@RPM Development Tools"        #安裝哪個組包旅东,@是關(guān)鍵詞
    - name: update software               #第三個任務(wù)的描述信息
      yum:                                  #調(diào)用yum模塊升級軟件
        name: '*'                           #需要升級哪些軟件
        state: latest                       #latest代表升級軟件
#備注:state的值可以是(present|absent|latest)
#present代表安裝軟件(默認是present)灭抑;absent代表卸載軟件
#latest代表升級軟件

Ansible變量應用案例

2.1 問題

沿用前面課程環(huán)境,繼續(xù)練習Ansible 特殊模塊并掌握自定義變量的方式抵代,具體要求如下:

  • 熟悉setup與debug模塊
  • 熟悉各種常見的變量定義方式

步驟一:Ansible特殊模塊

1)setup模塊

ansible_facts用于采集被管理設(shè)備的系統(tǒng)信息腾节,所有收集的信息都被保存在變量中,每次執(zhí)行playbook默認第一個任務(wù)就是Gathering Facts,使用setup模塊可以查看收集到的facts信息案腺。

[root@control ansible]# ansible test -m setup
192.168.4.10 | SUCCESS => {
"ansible_facts": {
    "ansible_all_ipv4_addresses": [
… 省略部分內(nèi)容…

試試自己找出下列變量:

  • ansible_all_ipv4_addresses #IP地址
  • ansible_bios_version #主板BIOS版本
  • ansible_memtotal_mb #總內(nèi)存
  • ansible_hostname #主機名
  • ansible_fqdn #主機的域名
  • ansible_devices.vda.partitions.vda1.size #某個磁盤分區(qū)的大小

2)debug模塊

debug模塊可以顯示變量的值庆冕,可以輔助排錯,通過msg可以顯示變量的值劈榨,變量需要使用{{}}擴起來访递。

[root@control ansible]# vim ~/ansible/debug.yml
---
- hosts: test
  tasks:
    - debug:
        msg: "主機名是:{{ ansible_hostname }}"
    - debug:
        msg: "總內(nèi)存大小:{{ ansible_memtotal_mb }}"
#備注調(diào)用debug模塊顯示某些具體的變量值
#debug模塊可以顯示變量的值,可以輔助排錯

步驟二:定義變量的方法

Ansible支持十幾種定義變量的方式同辣,這里我們僅介紹其中一部分變量拷姿。

下面是根據(jù)優(yōu)先級排序的定義方式:

  1. Inventory變量
  2. Host Facts變量
  3. Playbook變量
  4. 變量文件

1)Inventory變量(在主機清單配置文件中定義變量)。

[root@control ansible]# vim ~/ansible/inventory
[test]
node1  iname="nb" 
[proxy]
node2
[webserver]
node[3:4]
[webserver:vars]
iname="dachui"
#備注邑闺,在node1主機后面給該主機添加變量iname,值為nb.
#給webserver組定義變量,vars是關(guān)鍵詞不可以改變,webserver是上面定義的組
#給這個組定義變量iname="dachui"
... ...<部分后面的內(nèi)容省略>... ...

下面編寫劇本調(diào)用剛才的變量:(在劇本中需要調(diào)用變量是要使用{{}})

[root@control ansible]# vim ~/ansible/inventory_var.yml
---
- hosts: node1,webserver                         #定義需要遠程管理的主機是誰               
  tasks:                                           #劇目要完成哪些任務(wù)
    - name: create a user with var.              #劇目中的第一個任務(wù)描述信息
      user:                                        #調(diào)用user模塊創(chuàng)建用戶
        name: "{{ iname }}"                      #需要創(chuàng)建的用戶名是iname這個變量
#注意事項:
#在ansible劇本中當調(diào)用變量時跌前,開始位置就調(diào)用變量,就需要在{{}}外面加雙引號
#如果是在后面或者中間位置調(diào)用變量{{}}外面可以不加雙引號,也可以加雙引號
#如:
#  "{{ iname }}"
#  nihao {{ iname }}

2)Host Facts變量(可以直接調(diào)用ansible收集的系統(tǒng)信息)

[root@control ansible]# vim ~/ansible/facts_var.yml
---
- hosts: test
  tasks:
    - name: create user.
      user:
        name: "{{ansible_hostname}}"
#定義劇本,遠程所有被管理主機陡舅,調(diào)用user模塊抵乓,創(chuàng)建用戶
#需要創(chuàng)建的用戶名ansible_hostname是一個ansible_facts變量
#驗證: 到node1主機查看是否有一個與主機名同名的用戶

3)Playbook變量(使用vars關(guān)鍵詞可以在playbook內(nèi)定義變量)。

[root@control ansible]# vim ~/ansible/playbook_var.yml
---
- hosts: test
  vars:                                     #vars是關(guān)鍵詞靶衍,用來定義變量用的
    iname: heal                            #具體變量名是iname灾炭,值是heal
    ipass: '123456'                       #再定義一個變量名是ipass,值是123456
#注意密碼必須是字符串颅眶,需要引號                           
  tasks:                                   #tasks定義需要執(zhí)行的任務(wù)
    - name: Use variables create user.  #給任務(wù)寫個描述信息   
      user:                                #調(diào)用user模塊創(chuàng)建用戶
        name: "{{ iname }}"               #用戶名的是前面定義的變量
        password: "{{ ipass | password_hash('sha512') }}"
#密碼是前面定義好的ipass,管道給password_hash把密碼加密.

4)單獨定義個變量文件蜈出,在playbook中用vars_files調(diào)用該文件。

[root@control ansible]# vim ~/ansible/file_var.yml
---
- hosts: test
  vars_files: variables.yml             #當變量比較多時涛酗,專門定義一個文件用來存變量
  tasks:
    - name: create user.
      user:
        name: "{{ iname }}"
        password: "{{ ipass | password_hash('sha512') }}"
#調(diào)用user模塊創(chuàng)建用戶
#用戶名是變量文件variables.yml中定義的變量iname铡原,密碼也是變量文件中定義的變量
[root@control ansible]# vim  ~/ansible/variables.yml
---
iname: cloud
ipass: '123456'

附加思維導圖,如圖-2所示:

image

圖-2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末商叹,一起剝皮案震驚了整個濱河市燕刻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剖笙,老刑警劉巖卵洗,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異弥咪,居然都是意外死亡过蹂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門聚至,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酷勺,“玉大人,你說我怎么就攤上這事扳躬〈嗨撸” “怎么了勋功?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長库说。 經(jīng)常有香客問我,道長片择,這世上最難降的妖魔是什么潜的? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮字管,結(jié)果婚禮上啰挪,老公的妹妹穿的比我還像新娘。我一直安慰自己嘲叔,他們只是感情好亡呵,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著硫戈,像睡著了一般锰什。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丁逝,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天汁胆,我揣著相機與錄音,去河邊找鬼霜幼。 笑死嫩码,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的罪既。 我是一名探鬼主播铸题,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼琢感!你這毒婦竟也來了丢间?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤猩谊,失蹤者是張志新(化名)和其女友劉穎千劈,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牌捷,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡墙牌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了暗甥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喜滨。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖撤防,靈堂內(nèi)的尸體忽然破棺而出虽风,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布辜膝,位于F島的核電站无牵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厂抖。R本人自食惡果不足惜茎毁,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望忱辅。 院中可真熱鬧七蜘,春花似錦、人聲如沸墙懂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽损搬。三九已至碧库,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間巧勤,已是汗流浹背谈为。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工涂乌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留膘茎,地道東北人葬项。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓刺啦,卻偏偏與公主長得像政鼠,于是被迫代替她去往敵國和親缰冤。 傳聞我的和親對象是個殘疾皇子灌灾,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容