天天看點

自動化運維利器ansible中的劇本--Playbook一.Ad-Hoc的問題二.Playbook是什麼三.YAML四.Playbook 的編寫

一.Ad-Hoc的問題

學習AD-HOC,我們發現AD-HOC每次隻能在被管理節點上執行簡單的指令。在實際工作中面臨一些複雜操作執行起來力不從心,是以ansible引入了Playbook在幫助解決這類的複雜問題。

二.Playbook是什麼

Playbook通常被大家翻譯成劇本

可以認為它是Ansible 自定義的一門語言(可以将 Playbook 比作 Linux 中的 shell,而 Ansible 中的 Module 可以比作為 Linux 中的各種指令。)

三.YAML

1.特點

  • 以 # 為注釋符
  • 以 .yml 或者.yaml 結尾
  • 以 — 開始 , 以 … 結束, 但開始和結束标志都是可選的

2.基本文法

  • 大小寫敏感
  • 使用縮進表示層級關系
  • 縮進時是使用Tab鍵還是使用空格一定要達到統一,建議使用空格。
  • 相同層級的元素必須左側對齊即可

YAML支援的資料結構有三種

  • 字元串
  • 清單
  • 字典

2.1 字元串

---
#YAML 中的字元串可以不使用引号,即使裡面存在空格的時候,當然了使用單引号和雙引号也沒有錯。
 this is a string
 'this is a string'
 "this is a string"
#YAML 中若一行寫不完你要表述的内容的時候,可以進行折行。寫法如下: 
 long_line: |  		
       Example 1 		
       Example 2 		
       Example 3
 #或者 l
 ong_line: > 		 
            Example 1 		
            Example 2 		
            Example 3	 ...
           

2.2 清單

---
#若熟悉 Python 的話, 可以認為它就是Python中的List ,若熟悉 C 語言的話, 可以認為它是 C 中的數組。
#如何定義: 以短橫線開頭 + 空格 + 具體的值
- red
- green
- blue

#以上的值假如轉換成 python 的 List 會是這樣:
#['red', 'green', 'blue']
...
           

2.3 字典

---
#若熟悉 Python 的話, 可以認為它就是 Python 中的 Dict
#如何定義: key + 冒号(:) + 空格 + 值(value), 即 key: value

name: Using Ansible
code: D1234

#轉換為 python 的 Dict
#{'name': 'Using Ansibel', 'code': 'D1234'}
...
           

2.4 混合結構

以上,針對YAML 的所有基礎知識點就介紹完了。但在日常生活中,往往需要的資料結構會特别複雜,有可能會是字元串、清單、字典的組合形式。 這裡舉一個小例子:

所有人都上過學,都知道到學校裡是以班級為機關。我們去使用清單和字典的形式去描述一個班級的組成。

---
class:
  - name: stu1
    num: 001
  - name: stu2
    num: 002
  - name: stu3
    num: 003
{'class': [{'name': 'stu1', 'num': 1},{'name': 'stu2', 'num': 2},...]}
...
字典中有清單,清單中有字典
           

2.5 驗證YMAL文法

// 将YAML檔案,通過 Python 的YAML 子產品驗證, 若不正确則報錯。若正确則會輸出 YAML 裡的内容。

//注意使用時,一定確定安裝了yaml 軟體包。

python -c ‘import yaml,sys; printyaml.load(sys.stdin)’ myyaml.yml

python3 -c 'import yaml,sys;print(yaml.load(sys.stdin))'myyaml.yml

Example

// 正确的情況

cat myyaml.yml
---
- red
- green
- blue
...
#python -c 'import yaml,sys; print yaml.safe_load(sys.stdin)' < myyaml.yml
['red', 'green', 'blue']

// 錯誤的情況, 将YAML檔案寫錯
#cat myyaml.yml
---
- red
- green
-blue
...
#python -c 'import yaml,sys; print yaml.load(sys.stdin)' < myyaml.yml
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/yaml/__init__.py", line 71, in load
    return loader.get_single_data()
  File "/usr/local/lib/python2.7/site-packages/yaml/constructor.py", line 37, in get_single_data
    node = self.get_single_node()
...
...
           

四.Playbook 的編寫

1.Play的定義

1、每一個Play 都是以短橫杠開始的

2、每一個Play 都是一個YAML 字典格式

根據上面兩條Play 的規則,一個假想的 Play 應該是如下的樣子

---
- key1: value1
  key2: value2
  key3: value3
...
           

由于一個Playbook 是由一個或者多個Play構成, 那麼一個含有多個Play的Playbook 結構上應該是如下的樣子

---
#一個含有3個Play 的僞PlayBook構成
- key1: value1
  key2: value2
  key3: value3
- key4: value1
  key5: value2
  key6: value3
- key1: value1
  key2: value2
  key3: value3
...
           

2.Play的屬性

以上一小節中的Play為基礎, Play中的每一個key,比如 key1, key2 等;這些key在PlayBook中被定義為Play的屬性。

這些屬性都具有特殊的意義,我們不能随意的自定義Play 的屬性

常用屬性

  • name 屬性, 每個play的名字,可自定義
  • hosts 屬性, 每個play 涉及的被管理伺服器,同ad-hoc 中的資産選擇器
  • tasks 屬性, 每個play 中具體要完成的任務,以清單的形式表達
  • become 屬性,如果需要提權,則加上become 相關屬性
  • become_user 屬性, 若提權的話,提權到哪個使用者上
  • remote_user屬性,指定連接配接到遠端節點的使用者,就是在遠端伺服器上執行具體操作的使用者。若不指定,則預設使用目前執行 ansible Playbook 的使用者

3.一個完整的劇本

根據上一小節中介紹的真實的屬性,一個含有一個Play 的 Playbook 應該是如下的樣子

---
- name: the first play example
  hosts: webservers
  remote_user: root   #遠端使用者
  tasks:
    - name: install nginx package       #任務名稱
      yum: name=nginx state=present
    - name: copy nginx.conf to remote server
      copy: src=nginx.conf dest=/etc/nginx/nginx.conf
    - name: start nginx server
      service:
        name: nginx
        enabled: true
        state: started
           

4. tasks屬性中任務的多種寫法

#以啟動 nginx 服務,并增加開機啟動為例
#一行的形式:
service: name=nginx enabled=true state=started

#多行的形式:
service: name=nginx
         enabled=true
         state=started

#多行寫成字典的形式:
service:
  name: nginx
  enabled: true
  state: started
           

5.具有多個play的Playbook

---
- name: manage web servers
  hosts: webservers
  remote_user: root
  tasks:
    - name: install nginx package
      yum: name=nginx state=present
    - name: copy nginx.conf to remote server
      copy: src=nginx.conf dest=/etc/nginx/nginx.conf
    - name: start nginx server
      service:
        name: nginx
        enabled: true
        state: started
- name: manager db servers
  hosts: db_servers
  tasks:
    - name: update database confg
      copy: src=my.cnf dest=/etc/my.cnf 
           

6. 如何對Playbook進行文法校驗

下面校驗的方法,隻能校驗playbook是否正确,而不能校驗YAML檔案是否文法正确

因為playbook屬于YAML格式,我們同樣可以使用檢查YAML的文法格式來檢查playbook的文法正确性

7. 如何運作PlayBook

ansible-playbook -i hosts myplaybook.yml
           

8. 如何單步跟從調試playbook

// 執行Task中的任務,需要手動确認是否往下執行。
#ansible-playbook -i hosts myplaybook.yml --step
           

9.如何測試運作playbook

測試運作就是會執行完整個PlayBook ,但是所有Task中的行為都不會在遠端伺服器上執行,所有執行都是模拟行為。

#ansible-playbook -i hosts myplaybook.yml -C
// -C 為大寫的字母 C