厲害了!有人這樣對Ansible Playbook做簡介!
經過一系列的基礎鍛煉與磨礪,終于來到比較高大上的運用了,
(納尼?現在才開始???前程回顧:https://blog.csdn.net/qq_41765918/category_11512932.html)

1. 什么是playbook
中文名:劇本,它是一個自動化處理腳本, Playbook采用YAML語言撰寫,
2. playbook演示
以下做個簡單的操作演示,撰寫好主機清單后再進行劇本的撰寫,
(所以說嘛,基礎很重要,如果不記得主機清單https://blog.csdn.net/qq_41765918/article/details/121676991和組態檔https://blog.csdn.net/qq_41765918/article/details/121706648是如何運用的,快快去學習,)
[student@servera ~]$ cat hosts
servera
[student@servera ~]$ cat webserver.yml
---
- name: play to setup web server
hosts: servera
remote_user: root
become: yes
become_method: sudo
tasks:
- name: latest httpd version install
yum:
name: httpd
state: latest
[student@servera ~]$ ansible-playbook -i hosts webserver.yml
PLAY [play to setup web server] *********************************************************
TASK [Gathering Facts] ******************************************************************
ok: [servera]
TASK [latest httpd version install]******************************************************
changed: [servera]
PLAY RECAP ******************************************************************************
servera : ok=2 changed=1 unreachable=0 failed=0
3. Playbook作業流程

- playbook 劇本是由一個或多個"play"組成的串列
- play的主要功能在于將預定義的一組主機,裝扮成事先通過ansible中的task定義好的角色,Task
實際是呼叫ansible的一個module,將多個play組織在一個playbook中,即可以讓它們聯合起
來,按事先編排的機制執行預定義的動作, - Playbook 檔案是采用YAML語言撰寫的
(就正如圖片小人書,劇本都是由我們根據特定需求撰寫好的“腳本”,此“腳本”運用各種模塊通過作用于特定的主機清單而達到需求,)

4. YAML語法簡介
這里只涉及到playbook相關的語法(更多請參考官網http://www.yaml.org),
語法非常嚴格,請仔細仔細再仔細,
在單一檔案中,可用連續三個連字號(---)區分多個檔案,另外,還有選擇性的連續三個點號( ... )用來表示檔案結尾
次行開始正常寫Playbook的內容,一般建議寫明該Playbook的功能
? 使用#號注釋代碼
? 縮進必須是統一的,不能空格和tab混用,一般縮進2個空格(可以改造tab為縮進)
? 縮進的級別也必須是一致的,同樣的縮進代表同樣的級別,程式判別配置的級別是通過縮進結合換行來實作的
? YAML檔案內容和Linux系統大小寫判斷方式保持一致,是區別大小寫的,key/value的值均需大小寫敏感
? key/value的值可以寫在同一行,也可換行寫,同一行使用 , 逗號分隔
? value可是個字串,也可是另一個串列
? 一個完整的代碼塊功能需最少元素需包括 name和task
? 一個name只能包括一個task
? 使用 | 和 > 來分隔多行,實際上這只是一行,
include_newlines: |
exactly as you see
will appear these three
lines of poetry
ignore_newlines: >
this is really a
single line of text
despite appearances
? Yaml中不允許在雙引號中出現轉義符號,所以都是以單引號來避免轉義符錯誤
? YAML檔案擴展名通常為yml或yaml
很多剛學習的同學,往往運行報錯就掛在語法上,后續可通過不斷的練習來理解,
(語法基礎真的很重要,別 說了你又不聽,聽了你又不懂,懂了你又不做,做了你又做錯,錯了你又不認,認了你又不改,改了你又不服,)

List:串列
其所有元素均使用"-"打頭
- web
- dns
-空格web # 書寫格式
Dictionary:字典(鍵值對)
通常由多個key與value構成
多行寫法:
name: hunk
blog: "xxxxx"
name:空格hunk > 這個冒號后面必須是一個空格
同一行寫法:
需要使用{ }
{name: hunk, blog: "xxxxxx"} > 逗號后建議使用留一個空格
布林值的表示法:
yes/no true/false
create_key: yes
needs_agent: no
knows_oop: True
likes_emacs: TRUE
uses_cvs: false
5. Playbook核心元素
name
可選配置項,可有助于記錄playbook的運行說明,
hosts
hosts 行的內容是一個或多個組或主機的 patterns,以逗號為分隔符,通常是/etc/ansible/hosts定義的主機串列
remote_user 就是遠程執行任務的賬戶名:
---
- hosts: web,dns
remote_user: root
tasks
任務集
tasks:
- name: install httpd
yum:
name: httpd
- name: start httpd
service: name=httpd state=started
6. 改造vi中tab鍵功能
為了能更加輕松的編輯playbook,可設定在vi編輯yaml檔案時,按下tab鍵會進行一個雙空格縮進,
在 $HOME/.vimrc 添加以下內容
autocmd FileType yaml setlocal ai ts=2 sw=2 et
引數解釋:
set ai # 自動縮進
set ts=2 # tabstop,表示按一個tab之后,顯示出來的相當于幾個空格,默認的是8個,
set sw=2 # shiftwidth,表示每一級縮進的長度
set et # expandtab,將tab轉成空格,縮進用空格來表示
(別問我為什么要改寫,因為當你見到別人噼里啪啦地敲完鍵盤寫好playbook時,你可能還在默念按了多少個空格,>.<)

7. playbook書寫風格
以下書寫例子中,就是shorthand格式,比較舊的書寫方法:
- name: copy new yum config to host
copy: src=/etc/yum.repos.d/ dest=/etc/yum.repos.d/
普遍的yaml格式書寫:
- name: copy new yum config to host
copy:
src: /etc/yum.repos.d/
dest: /etc/yum.repos.d/
基本都是使用新的寫法,便于閱讀和排錯,
8. playbook執行
檢測語法:ansible-playbook --syntax-check webserver.yml
模擬執行:ansible-playbook -C webserver.yml
真實執行:ansible-playbook webserver.yml
執行的詳細程度:
-v :顯示任務結果,
-vv :任務結果和任務配置都會顯示
-vvv :包含關于與受管主機連接的資訊
-vvvv:增加了連接插件相關的額外詳細程度選項,包括受管主機上用于執行腳本的用戶,以及所執行的腳本
9. 練習演示----如何撰寫playbook
設定tab鍵縮進
[student@servera ~]$ cat .vimrc
autocmd FileType yaml setlocal ai ts=2 sw=2 et
查看組態檔和主機清單
[student@servera ~]$ mkdir playbook
[student@servera playbook]$ cat ansible.cfg
[defaults]
inventory=inventory
remote_user=student
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
[student@servera playbook]$ cat inventory
[web]
serverc
serverd
撰寫所需要的劇本
[student@servera playbook]$ cat site.yml
---
- name: Install and start Aapche HTTPD
hosts: web
tasks:
- name: httpd package is present
yum:
name: httpd
state: present
- name: correct index.html is present
copy:
content: "This is a test page.\n"
dest: /var/www/html/index.html
- name: httpd is started
service:
name: httpd
state: started
enabled: true
語法檢查
[student@servera playbook]$ ansible-playbook --syntax-check site.yml
playbook: site.yml
運行劇本前進行語法檢查是一個良好習慣,
執行劇本
[student@servera playbook]$ ansible-playbook site.yml
PLAY [Install and start Aapche HTTPD] ***************************************************
TASK [Gathering Facts] ******************************************************************
ok: [serverc]
ok: [serverd]
TASK [httpd package is present] *********************************************************
changed: [serverd]
changed: [serverc]
TASK [correct index.html is present] ****************************************************
changed: [serverc]
changed: [serverd]
TASK [httpd is started] *****************************************************************
changed: [serverc]
changed: [serverd]
PLAY RECAP ******************************************************************************
serverc : ok=4 changed=3 unreachable=0 failed=0
serverd : ok=4 changed=3 unreachable=0 failed=0
冪等性
[student@servera playbook]$ ansible-playbook site.yml
…………
此為Ansible重要特性之一,用練習演示更容易進行理解,
結果訪問檢查
[student@servera playbook]$ curl serverc
This is a test page.
[student@servera playbook]$ curl serverd
This is a test page.
10. playbook提權
可以寫在劇本中,與hosts,tasks同級
- hosts: all
become: true
become_method: sudo
become_user: root
tasks:
- debug:
msg: "Test"
當然,不在劇本上撰寫,在組態檔上撰寫也可以,如果兩個地方都進行撰寫,在劇本中的優先級會比組態檔上的高,例如:組態檔上啟動提權become: yes,但劇本上配置了become: no,最終生效為劇本上的配置,

11. 善于模塊檔案
ansible-doc -l 查看串列
ansible-doc modulename 查看模塊幫助檔案
(上一篇文章總結處https://blog.csdn.net/qq_41765918/article/details/121722471提及,查看幫助真的很重要~~)

12. 練習演示----執行多個playbook
查看組態檔和主機清單
[student@servera ~]$ mkdir playbook-multi
[student@servera ~]$ cd playbook-multi/
[student@servera playbook-multi]$ cat ansible.cfg
[defaults]
inventory=inventory
remote_user=student
[privilege_escalation]
become=False
become_method=sudo
become_user=root
become_ask_pass=False
[student@servera playbook-multi]$ cat inventory
servera
撰寫所需要的劇本
[student@servera playbook-multi]$ cat web.yml
---
- name: Enable web services
hosts: servera
become: yes
tasks:
- name: latest version of httpd and firewalld installed
yum:
name:
- httpd
- firewalld
state: latest
- name: test html page is installed
copy:
content: "Hello World!\n"
dest: /var/www/html/index.html
- name: firewalld enabled and running
service:
name: firewalld
enabled: true
state: started
- name: firewalld permits http service
firewalld:
service: http
permanent: true
state: enabled
immediate: yes
- name: httpd enabled and running
service:
name: httpd
enabled: true
state: started
- name: Test web server
hosts: localhost
become: no
tasks:
- name: connect to web server
uri:
url: http://servera
return_content: yes
status_code: 200
語法檢查
[student@servera playbook-multi]$ ansible-playbook --syntax-check web.yml
playbook: web.yml
使用-v執行劇本
[student@servera playbook-multi]$ ansible-playbook web.yml -v
PLAY [Enable web services] **************************************************************
TASK [Gathering Facts] ******************************************************************
ok: [servera]
TASK [latest version of httpd and firewalld installed] ******************************************
ok: [servera] => {"changed": false, "msg": "", "rc": 0, "results": ["All packages providing httpd are up to date", "All packages providing firewalld are up to date", ""]}
…………
TASK [connect to web server] ************************************************************
ok: [localhost] => {"accept_ranges": "bytes", "changed": false, "connection": "close", "content": "Hello World!\n", "content_length": "37", "content_type": "text/html; charset=UTF-8", "cookies": {}, "cookies_string": "", "date": "Fri, 04 Sep 2020 12:54:49 GMT", "etag": "\"25-5ae7c5e78c9df\"", "last_modified": "Fri, 04 Sep 2020 12:54:27 GMT", "msg": "OK (37 bytes)", "redirected": false, "server": "Apache/2.4.6 (Red Hat Enterprise Linux)", "status": 200, "url": "http://servera"}
PLAY RECAP **********************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
servera : ok=6 changed=0 unreachable=0 failed=0
總結
- yaml語法非常嚴格,仔細撰寫,
- 改造tab鍵以提高撰寫劇本的效率,
- 語法檢查是一個良好習慣,
- 善用模塊檔案查看引數說明與例子,
- 通過練習與實驗了解冪等性,
- 可使用 -v 引數查看詳細輸出進行排錯,
- 若喜歡金魚哥的文章,順手點個贊,也可點個關注,因為后續會不斷上干貨,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/374688.html
標籤:其他
上一篇:軟體體系結構復習
