一、Playbook的實施
1、Ansible playbook與臨時命令概述:
- 臨時命令可以作為一次性命令對一組目標主機運行一項簡單的任務
- play是針對清單中選定的主機運行的一組有序任務。playbook是一個文本文件,其中包含由一個或多個按特定順序運行的play組成的列表
- Play可以將一系列冗長而復雜的手動管理任務轉變為可輕松重復的例程,並且具有可預測的成功成果
- 在playbook中,可以將play內的任務序列保存為人類可讀並可立即運行的形式
2、Ansible playbook的編寫規則
- Playbook是以YAML格式編寫的文本文件,通常使用擴展名yml保存
- Playbook使用空格字符縮進來表示其數據結構。YAML對用於縮進的空格數量沒有嚴格的要求,但有兩個基本的規則:只有空格字符可用於縮進,不允許使用tab鍵。約定俗成的縮進量一般是一級2個空格
- 處於層次結構中同一級別的數據元素(例如同一列表中的項目)必須具有相同的縮進量
- 如果項目屬於其他項目的子項,其縮進量必須大於父項
- Playbook開頭的一行由三個破折號(---)組成,這是文檔開始標記。其末尾可能使用三個圓點(...)作為文檔結束標記,盡管在實踐中這通常會省略
- YAML列表中的項目以一個破折號加空格開頭
- Play本身是一個鍵值對集合。同一play中的鍵應當使用相同的縮進量
- 作為play中的一部分,tasks屬性按順序實際列出要在受管主機上運行的任務。列表中各項任務本身是一個鍵值對集合
- playbook中play和任務列出的順序很重要,Ansible會按照相同的順序運行它們
3、編寫規則實例
- 執行單個任務實例:
-
//安裝httpd服務 [root@localhost ~]# vim example.yml --- - name: This is test example playbook hosts: 192.168.121.81 #如果是多個主機,可以使用all表示對所有主機操作 tasks: - name: install httpd yum: name: httpd state: present //執行example.yml文件 [root@localhost ~]# ansible-playbook example.yml PLAY [This is test example playbook] ************************************************************************************************************************************** TASK [Gathering Facts] **************************************************************************************************************************************************** ok: [192.168.121.81] TASK [install httpd] ****************************************************************************************************************************************************** changed: [192.168.121.81] PLAY RECAP **************************************************************************************************************************************************************** 192.168.121.81 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
-
- 執行多個任務實例:
-
//執行多個任務,先安裝httpd服務,然后啟動httpd服務 [root@localhost ~]# vim example.yml --- - name: This is test example playbook hosts: 192.168.121.81 tasks: - name: install httpd yum: name: httpd state: present - name: start httpd service service: name: httpd state: started enabled: yes //執行example.yml文件 [root@localhost ~]# ansible-playbook example.yml PLAY [This is test example playbook] ************************************************************************************************************************************** TASK [Gathering Facts] **************************************************************************************************************************************************** ok: [192.168.121.81] TASK [install httpd] ****************************************************************************************************************************************************** ok: [192.168.121.81] TASK [start httpd service] ************************************************************************************************************************************************ changed: [192.168.121.81] PLAY RECAP **************************************************************************************************************************************************************** 192.168.121.81 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 //查看受管主機上httpd服務狀態 [root@localhost ~]# ansible 192.168.121.81 -m shell -a 'systemctl status httpd' 192.168.121.81 | CHANGED | rc=0 >> ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2020-08-29 14:34:37 CST; 2min 15s ago Docs: man:httpd.service(8) Main PID: 17031 (httpd) Status: "Running, listening on: port 80" Tasks: 213 (limit: 11340) Memory: 43.4M CGroup: /system.slice/httpd.service ├─17031 /usr/sbin/httpd -DFOREGROUND ├─17033 /usr/sbin/httpd -DFOREGROUND ├─17034 /usr/sbin/httpd -DFOREGROUND ├─17035 /usr/sbin/httpd -DFOREGROUND └─17036 /usr/sbin/httpd -DFOREGROUND Aug 29 14:34:37 localhost.localdomain systemd[1]: Starting The Apache HTTP Server... Aug 29 14:34:37 localhost.localdomain httpd[17031]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message Aug 29 14:34:37 localhost.localdomain systemd[1]: Started The Apache HTTP Server. Aug 29 14:34:37 localhost.localdomain httpd[17031]: Server configured, listening on: port 80
-
4、執行playbook
- absible-playbook命令可用於運行playbook。該命令在控制節點上執行,要運行的playbook的名稱則作為參數傳遞。
[root@localhost ~]# ansible-playbook example.yml- 在運行playbook時,將生成輸出來顯示所執行的play和任務。輸出中也會報告執行的每一項任務的結果
- 在playbook運行時,屏幕中會顯示每個play和任務的name鍵的值
- Gathering Facts任務是一項特別的任務,setup模塊通常在play啟動時自動運行這項任務
- 對於含有多個play和任務的playbook,設置name屬性后可以更加輕松地監控playbook執行的進展
- 通常而言,Ansible Playbook中的任務是冪等的,而且能夠安全地多次運行playbook。如果目標受管主機已處於正確的狀態,則不應進行任何更改
5、執行ansible-playbook,提高輸出信息詳細程度
- 輸出詳細程度命令:
-
選項 描述 -v 顯示任務結果 -vv 任務結果和任務配置都會顯示 -vvv 包含關於與受管主機連接的信息 -vvvv 增加了連接插件相關的額外詳細程序選項,包括受管主機上用於執行腳本的用戶以及所執行的腳本
-
6、語法驗證
- 在執行playbook之前,最好要進行驗證,確保其內容的語法正確無誤。ansible-playbook命令提供了一個--syntax-check選項,可用於驗證playbook的語法
- 語法實例:
[root@ansible roles]# ansible-playbook --syntax-check vhosts.yaml playbook: vhosts.yaml //沒有報錯,說語法沒有錯誤
7、檢測文件執行是否出錯
- 可以使用-C選項對playbook執行空運行。這會使Ansible報告在執行該playbook時將會發生什么更改,但不會對受管主機進行任何實際的更改
- 檢測實例:
[root@ansible roles]# ansible-playbook -C vhosts.yaml ........
二、執行多個play
1、編寫多個play規則
- Playbook是一個YAML文件,含有由一個或多個play組成的列表,記住一個play按順序列出了要對清單中的選定主機執行的任務
- Playbook中的各個play編寫為playbook中的頂級列表項。各個play是含有常用play關鍵字的列表項
- 演示實例:
--- - name: first play hosts: 192.168.121.81 tasks: - name: first task yum: name: httpd status: present - name: second task service: name: httpd enabled: true - name: second play hosts: 192.168.121.82 tasks: - name: first task service: name: mariadb enabled: true
2、playbook中的遠程用戶和特權
Playbook可以將不同的遠程用戶或特權升級設置用於play,取代配置文件中指定的默認設置。這些在playbook本身中與hosts或tasks關鍵字相同的級別上設置
1️⃣:用戶屬性
- playbook中的任務通常通過與受管主機的網絡連接來執行
- 用於任務執行的用戶帳戶取決於Ansible配置文件/etc/ansible/ansible.cfg中的不同關鍵字
- 運行任務的用戶可以通過remote_user關鍵字來定義。不過,如果啟用了特權升級,become_user等其他關鍵字也會發生作用
- 如果用於任務執行的Ansible配置中定義的遠程用戶不合適,可以通過在playbook中使用remote_user關鍵字覆蓋
- 演示實例:(remote_user 表示連接遠程主機的用戶名)
--- - name: test file hosts: all remote_user: lisi
2️⃣:特權升級屬性
- Ansible也提供額外的關鍵字,從而在playbook內定義特權升級參數
- become布爾值關鍵字可用於啟用或禁用特權升級,無論它在Ansible配置文件中的定義為何。它可取yes或true值來啟用特權升級,或者取no或false值來禁用它
- 演示實例:(使用“true”或“yes”來表示啟用這個特權,如:become=true)
--- - name: test file hosts: all remote_user: lisi become: yes
- 如果啟用了特權升級,則可以使用become_method關鍵字來定義特定playbook期間要使用的特權升級方法
- 演示實例:(become_method=sudo 表示用什么方式將普通賬戶切換到root或所需的其他賬戶,同樣包括普通用戶使用sudo執行命令,這里可以用su或sudo)
--- - name: test file hosts: all remote_user: lisi beacome: yes become_method: sudo
- 演示實例:(become_method=sudo 表示用什么方式將普通賬戶切換到root或所需的其他賬戶,同樣包括普通用戶使用sudo執行命令,這里可以用su或sudo)
- 此外,啟用了特權升級時,become_user關鍵字可定義特定play上下文內要用於特權升級的用戶帳戶
- 演示實例:(become_user=root 設置為root賬戶,相當於我們以普通賬戶登入到遠程主機時,再使用su - root切換為root賬戶)
--- - name: test file hosts: all remote_user: lisi beacome: yes become_method: sudo become_user: root //become_user為普通用戶時,表示以普通用戶身份登錄遠程主機
- 演示實例:(become_user=root 設置為root賬戶,相當於我們以普通賬戶登入到遠程主機時,再使用su - root切換為root賬戶)
3️⃣:演示如何在play中使用關鍵字
--- - name: /etc/hosts is up to date hosts: 192.168.121.81 remote_user: root become: yes tasks: - name: 192.168.121.81 in /etc/hosts lineinfile: path: /etc/hosts line: '192.168.121.81 web1.example.com' state: present
3、查找用於任務的模塊
1️⃣:對於每一個模塊,Ansible官網提供了其功能摘要,以及關於如何通過模塊的選項來調用各項具體功能的說明
- ansible-doc -l命令。這將顯示模塊名稱列表以及其功能的概要
-
[root@ansible ~]# ansible-doc -l
-
2️⃣:使用ansible-doc [module name]命令來顯示模塊的詳細文檔
- 演示實例:
[root@ansible ~]# ansible-doc yum
3️⃣:ansible-doc命令還提供-s選項,它會生成示例輸出,可以充當如何在playbook在使用特定模塊的示范,此輸出可以作為起步模板,包含在實施該模塊以執行任務的playbook中。輸出中包含的注釋,提醒管理員各個選項的用法
- 演示實例:
[root@ansible ~]# ansible-doc -s yum
4、play語法變化
1️⃣:YAML注釋
- 注釋也可以用於提高可讀性。在YAML中,編號或井號字符(#)右側的所有內容都是注釋
- 如果注釋的左側有內容,請在該編號符號的前面加一個空格
2️⃣:YAML字符串
- YAML中的字符串通常不需要放在引號里,即使字符串中包含空格。字符串可以用雙引號或單引號括起
- 實例:
this is a string 'this is another string' "this is yet another a string"
- 實例:
- 編寫多行字符串有兩種方式。可以使用管道符表示要保留字符串中的換行字符
- 實例:
include_newlines: | Example Company 123 Main Street Atlanta, GA 30303
- 實例:
- 要編寫多行字符串,還可以使用大於號字符來表示換行字符轉換成空格並且行內的引導空白將被刪除
- 實例:
fold_newlines: > This is an example of a long string, that will become a single sentence once folded.
- 實例:
3️⃣:YAML字典
- 字典實例:
name: svcrole svcservice: httpd svcport: 80
4️⃣:YAML列表
- 實例:
hosts: - 192.168.121.81 - 192.168.121.82 - 192.168.121.83