在上一篇文章中, Ansible 臨時命令..你在那裡學到的一切都適用於這篇文章,但方式不同。本教程將通過示例向您展示 Ansible 劇本是什麼以及如何使用它。
內容
什麼是 Ansible 劇本?
腳本是 YAML 用於在環境中的託管主機上執行一項或多項任務的文件。
ad hoc 命令和 playbook 之間的主要區別在於,您可以使用 ad hoc 命令來創建簡單的單行,或者可以在 shell 腳本中使用 ad hoc 命令來執行簡單的任務。對於復雜的重複操作,您需要創建一個劇本,將其保存在中央存儲庫中,並根據需要使用它。
假設您是系統管理團隊的一員。每當構建新服務器時,您的團隊負責根據您公司的政策加強服務器。
在這種情況下,您可以創建一個劇本來增強您的服務器。現在可以將相同的劇本用於需要增強的 N 台新主機。
我的 Ansible 實驗室結構
使用由兩個 Ubuntu 20.04 LTS 節點創建的 ansible 實驗室。如果需要,您可以參考以下文章複製相同的實驗室設置:
在 Linux 上使用 Vagrant 和 Virtualbox 自動化 Ansible 實驗室設置
創建您的第一個 Ansible 劇本
正如我之前所說,腳本是 YAML 格式。腳本有 .yml
還 .yaml
推遲。 如果您想了解有關 YAML 的更多信息,請查看以下鏈接。
YAML 教程 | YAML 入門
下面是一個示例劇本,用於展示該劇本的工作原理。這是一個簡單的劇本,用於在您登錄到節點時設置自定義橫幅消息。
- name: First Play - Modify banner message hosts: ubuntu2 gather_facts: false become: yes tasks: - name: Remove Execute Permission from /etc/update-motd.d/* file: path: /etc/update-motd.d/ mode: u=rw,g=rw,o=rw recurse: yes - name: ADD BANNER MESSAGE copy: content: "Welcome to OSTechnix" dest: /etc/motd
讓我們來看看這個腳本的每個部分。劇本分為兩部分。第一部分包含重播定義,例如重播名稱、目標主機和權限提升。
- 姓名 – playbook 的播放名稱應該只是目標主機、參數和任務的邏輯組。您可以在劇本中播放多個劇本。給腳本起一個描述性的名稱。
- 主持人 – 目標主機。 Ansible 檢查清單文件以確保在主機上指定的值在清單文件中可用。
- 變得 當設置為 – ‘是的’ 該任務以 sudo 權限運行。因為我正在更改權限
/etc/
在目錄中,任務必須以提升的權限發送。
有關更多信息,請參閱我們關於提升權限的綜合文章。
Ansible SSH 身份驗證和特權提升
第二部分定義任務。必須使用關鍵字 “工作” 定義任務。在這裡,我們創建了兩個任務。每個任務必須用關鍵字命名 “姓名”..
- 第一個任務移除執行權限
/etc/update-motd.d/*
目錄。我在用著 文檔 用於此的模塊。 - 第二個任務寫入字符串 “歡迎來到 OS Technix” 到達
/etc/motd
文件使用 複製 模塊。
在運行 playbook 之前檢查目標節點的狀態(managed2.anslab.com) 登錄節點。當您登錄到節點時,您將看到一條默認橫幅消息,指示所有文件都具有執行權限。
$ ssh [email protected]

要運行 playbook,請從終端運行以下命令:
$ ansible-playbook <playbook-name> # SYNTAX $ ansible-playbook banner_mod.yml

讓我們了解輸出。
1.1。 運行劇本時,首先看到的是劇本名稱。
PLAY [Modify banner message] *
2.2. ansible 執行的第一個任務是 “收集事實”..此任務未在 playbook 中定義,但除非您將其關閉,否則它將運行。
TASK [Gathering Facts] *
ok: [managed2]
3.3. 現在 YAML 文件中定義的作為 play 的一部分的任務將開始一個一個地運行。 Ansible 從上到下讀取 playbook,因此任務按照 playbook 中定義的順序運行。
TASK [Remove Execute Permission from /etc/update-motd.d/*] ******************************************************************************************* changed: [managed2] TASK [ADD BANNER MESSAGE] **************************************************************************************************************************** changed: [managed2]
4.4. 完成所有任務後,您將看到一個遊戲摘要,顯示各種任務的統計數據總數。在這個例子中,總共執行了三個任務(ok = 3),包括事實收集,只有兩個任務(changed = 2)對被管節點進行了更改。
PLAY RECAP ****************************************** managed2 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
您現在可以驗證受管節點以查看更改是否已成功應用。

禁用事實收集
如上一節所述,當你運行 playbook 時,ansible 設置模塊..您可以通過將以下行添加到您的劇本來禁用事實收集:
gather_facts : false

現在,當您再次運行 playbook 時,您將只看到 playbook 中定義的兩個任務。 Ansible 是冪等的,所以如果對象發生了變化,ansible 不會嘗試去改變對象的狀態。因此,輸出如下所示: 好的..

如果您需要針對大量主機運行它,收集事實可能會減慢您的劇本。這是因為 ansible 需要連接到託管節點並收集有關該節點的大量數據。這不是在所有情況下都需要的。
您可以看到有和沒有以下事實的執行時間差異:
$ time ansible-playbook banner_mod.yml # WITHOUT FACTS real 0m1.642s user 0m0.731s sys 0m0.220s $ time ansible-playbook banner_mod.yml # WITH FACTS real 0m2.547s user 0m1.139s sys 0m0.187s
執行多個播放
您可以在劇本中播放多個劇本。如下圖所示,我的第二個遊戲任務是重啟 sshd
使用服務 服務 該模塊位於不同的主機上。

- name: Second Play - Restart SSHD service hosts: ubuntu1 gather_facts: false become: yes tasks: - name: Restart SSHD in managed1.anslab.com service: name: sshd state: restarted
讓我們再次運行劇本。從輸出中,您可以看到兩次播放都成功了。
$ ansible-playbook banner_mod.yml

這應該讓您對如何創建和運行劇本有一個公平的認識。該劇本支持其他有用的功能。這將在下一節中解釋。
檢查腳本語法
你可以使用它 --syntax-check
檢查劇本語法錯誤的標誌。我是故意的 “收集事實” 腳本行。
$ ansible-playbook --syntax-check banner_mod.yml

要求確認
使用時 --step
對於每個旗幟,遊戲中的任務,您將被要求確認您是否要繼續該任務。
$ ansible-playbook --step banner_mod.yml

運行測試運行
您可以模擬運行它,而不是在受管節點上運行任務 -C
還 --check
橫幅。
$ ansible-playbook -C banner_mod.yml
從特定任務開始
您可以選擇從特定任務運行 playbook。從下圖中可以看出,我從 Play2(task1)開始,所以 play1 中的兩個任務都被跳過了。使用標誌 --start-at-task
將任務名稱作為參數傳遞。
$ ansible-playbook banner_mod.yml --start-at-task "Restart SSHD in managed1.anslab.com"

使用標籤執行任務
遊戲和任務 標籤..標籤允許您使用特定標籤執行任務或跳過它們。
您可以在下面看到我使用的圖像 “標籤” 設置關鍵字和設置值。 您還可以為標籤添加多個值。

您可以通過運行以下命令獲取任務列表及其標籤:
$ ansible-playbook banner_mod.yml --list-tasks
$ ansible-playbook banner_mod.yml --list-tags

利用 -t
添加標籤並將標籤名稱作為參數傳遞。您可以執行特定的基於標籤的任務或多個標籤,如下所示。在下面的示例中,我們使用了來自兩個不同戲劇的兩個不同標籤。
$ ansible-playbook -t "set_perm","restart service" banner_mod.yml

您還可以使用跳過任務來執行所有其他任務 --skip-tags
橫幅。
$ ansible-playbook -t "set_perm","restart service" --skip-tags "set_perm" banner_mod.yml

提高詳細程度
該劇本可能無法按預期工作。這可能在後台或其他錯誤中。
您可以在運行 playbook 以調試問題時提高詳細程度 (-v)。詳細程度分為四個級別。你能行的 ansible.cfg
屬性”verbosity=<level
或者從終端的使用 -v
或 ANSIBLE_VERBOSITY 環境變量。
$ ansible-playbook -vvvv -t "set_perm","restart service" --skip-tags "set_perm" banner_mod.yml # VERBOSE LEVEL SET TO 4(-vvvv)
[OR]
$ ANSIBLE_VERBOSITY=4 ansible-playbook -vvvv -t "set_perm","restart service" --skip-tags "set_perm" banner_mod.yml # VERBOSE LEVEL SET TO 4(ENV VARIABLE)

並行處理的控制
運行 playbook 時,ansible 會批量運行任務。默認情況下,ansible 在五個節點上並行運行任務。 當所有五個節點的所有任務都完成後,您將移動到下一組五個節點。
同樣,在所有節點上分五批運行任務,直到任務完成,然後繼續執行下一個任務並重複相同的步驟。
您可以通過設置和設置要並行處理的節點數來控制並行度。 “叉子” 參數 ansible.cfg
文檔。
[defaults]
inventory = inventory
host_key_checking = False
forks=20
我將分叉值設置為 20。現在您可以在 20 個節點上並行處理任務。同樣,您可以根據需要增加/減少計數。
您可以覆蓋中設置的值 ansible.cfg
通過文件 -f
還 --forks
橫幅。以下命令用 15 覆蓋分叉值 20。
$ ansible-playbook banner_mod.yml -f 15
結論是
在本文中,您學習瞭如何創建 Ansible playbook 以及 playbook 支持的各種參數和選項。 playbook 中還有許多其他可用的功能,例如變量、條件、循環等。我們將在以後的文章中介紹這一點。
下一個相關:
- 如何在 Ansible Playbook 中使用變量
AnsibleAnsible 命令 AnsiblePlaybooksAnsible 系列Ansible 教程DevOpsIT自動化LinuxLinux 管理開源PlaybookYAML