在上一篇文章中, Ansible 臨時命令..你在那裡學到的一切都適用於這篇文章,但方式不同。本教程將通過示例向您展示 Ansible 劇本是什麼以及如何使用它。

內容

  1. 什麼是 Ansible 劇本?
  2. 我的 Ansible 實驗室結構
  3. 創建您的第一個 Ansible 劇本
  4. 禁用事實收集
  5. 執行多個播放
  6. 檢查腳本語法
  7. 要求確認
  8. 運行測試運行
  9. 從特定任務開始
  10. 使用標籤執行任務
  11. 提高詳細程度
  12. 並行處理的控制
  13. 結論是

什麼是 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]
默認狀態-Managed2 節點 默認狀態 – Managed2 節點

要運行 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