返回文章列表

Ansible Galaxy 角色管理與進階應用

本文探討 Ansible Galaxy 的角色管理機制,包含搜尋、安裝、發布和移除角色。同時也介紹了 ansible.cfg 設定檔的常用選項,以及如何使用 serial 引數控制批次執行和 max_fail_percentage 設定容錯率。此外,文章還涵蓋了 ansible-pull 的自動化佈署技巧和

DevOps 自動化

Ansible Galaxy 作為 Ansible 角色的中央樞紐,簡化了複雜應用程式的佈署和組態流程。透過 ansible-galaxy 命令,開發者可以輕鬆搜尋、下載和管理來自社群的分享角色,或發布自己的客製化角色。除了角色管理,ansible.cfg 設定檔允許自訂 Ansible 的行為,例如設定預設 inventory 檔案、遠端連線埠和許可權提升設定。這對於標準化團隊的 Ansible 環境至關重要。此外,serial 關鍵字提供了更精細的控制,讓開發者可以分批執行任務,有效管理大量主機,並搭配 max_fail_percentage 引數設定可接受的錯誤閾值,提升佈署的可靠性。

使用Ansible Galaxy管理角色

Ansible Galaxy是一個用於分享和重複使用Ansible角色的平台。透過Ansible Galaxy,使用者可以輕鬆地搜尋、安裝和管理角色,從而簡化了Ansible的組態和佈署流程。

搜尋角色

要找到合適的角色,可以使用ansible-galaxy search命令進行搜尋。搜尋方式有多種,包括根據角色名稱、作者或標籤進行搜尋。

根據角色名稱搜尋

可以直接搜尋角色名稱,例如搜尋與PHP相關的角色:

$ ansible-galaxy search php

根據作者搜尋

可以根據作者名稱進行搜尋,例如搜尋geerlingguy的角色:

$ ansible-galaxy search --author geerlingguy

根據標籤搜尋

可以使用標籤進行搜尋,例如搜尋與虛擬化相關的角色:

$ ansible-galaxy search --galaxy-tags virtualization

結合多個搜尋條件

可以結合多個條件進行搜尋,例如搜尋在Ubuntu上執行的PHP7相關角色:

$ ansible-galaxy search php7 --platforms=ubuntu

檢視角色資訊

找到感興趣的角色後,可以使用ansible-galaxy info命令檢視該角色的詳細資訊:

$ ansible-galaxy info geerlingguy.git

此命令會顯示角色的描述、最近的提交資訊、依賴關係等重要資訊。

內容解密:

  • ansible-galaxy info命令用於檢索指定角色的詳細資訊。
  • 顯示的資訊包括角色描述、最近的提交雜湊和訊息、公司名稱、建立日期、下載次數、分支數等。
  • 這些資訊有助於瞭解角色的功能和品質。

登入和管理角色

要發布自己的角色,需要先登入Ansible Galaxy。登入時需要提供Github憑證,Ansible Galaxy會利用這些憑證透過Github API建立存取權杖。

登入Ansible Galaxy

$ ansible-galaxy login

匯入角色

登入後,可以匯入自己的角色:

$ ansible-galaxy import github_username repo_name

內容解密:

  • ansible-galaxy import命令用於將Github上的角色倉函式庫匯入到Ansible Galaxy。
  • 需要提供Github使用者名稱和倉函式庫名稱。
  • 匯入過程中,Ansible Galaxy會解析meta/main.yml檔案中的資訊,如標籤和平台。

準備發布角色

在發布角色之前,需要完成以下步驟:

  1. 編寫角色並實作所需任務。
  2. 將角色上傳到Github。
  3. 使用ansible-galaxy import命令將角色註冊到Ansible Galaxy。

確保在meta/main.yml檔案中填寫了正確的描述、標籤和平台資訊,否則匯入可能會失敗。

第9章 ■ Ansible進階應用

管理Ansible Galaxy角色

若未來決定不再於Ansible Galaxy上保留某個角色,可以使用ansible-galaxy delete命令將其移除。與匯入時相同,需要指定GitHub使用者名稱和儲存函式庫名稱,Ansible Galaxy會自動解析正確的角色名稱。舉例來說,若要刪除剛才匯入的角色,可以執行以下命令:

$ ansible-galaxy delete mheap ansible-role-demo
Role mheap.ansible-role-demo deleted

此操作會將角色從Ansible Galaxy移除,但該角色仍可在GitHub上供人使用,尤其是當他人直接透過requirements.yml指向該角色時。務必為您的角色發布適當的授權條款,以便他人瞭解使用您的程式碼時的相關規範。若不確定應採用何種授權條款,可參考http://choosealicense.com/以協助您做出決定。

ansible.cfg設定檔

大多數Ansible選項都可透過ansible.cfg設定預設值。此檔案採用INI格式(與您的inventory檔案相同),可用於設定執行階段所有可指定選項的預設值,甚至更多!Ansible會在其預設位置(通常為/etc/ansible/ansible.cfg)及目前目錄中尋找此檔案。這意味著您可以在專案中附帶一個ansible.cfg檔案。

您可以參閱包含所有可用選項的範例檔案:https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg。以下將重點介紹表9-2中一些較為實用的選項。

表9-2. ansible.cfg設定選項

設定選項說明
nocows還記得第1章中Ansible可能(或可能不)在輸出中顯示ASCII牛嗎?若安裝了cowsay,Ansible會使用cowsay工具格式化任務輸出。若不想啟用此功能,可在ansible.cfg中停用cowsay。
[defaults]<br>nocows = 1
inventory指定要使用的inventory檔案名稱。可以是標準文字檔案或可執行的inventory指令碼,如ec2.py(正如第2章所討論)。例如:
[defaults]<br>inventory = ./ec2.py
remote_port若SSH伺服器執行於非標準埠,可設定remote_port,Ansible將預設使用該埠,而無需在inventory檔案中設定。例如:
[defaults]<br>remote_port = 22345
gathering預設情況下,Ansible會嘗試收集有關伺服器的事實。若您不使用這些事實,並希望避免在所有playbook中新增gather_facts: False,可透過ansible.cfg停用事實收集:
[defaults]<br>gathering = explicit
remote_user登入時使用的使用者。Ansible預設會以目前使用者執行(假設以michael登入,則Ansible會將遠端使用者設為michael)。若有專門用於執行Ansible的使用者(建議如此),可在ansible.cfg中設定預設值。例如,將預設使用者設為dedicateduser:
[defaults]<br>remote_user = dedicateduser
private_key_file用於登入遠端機器的SSH金鑰檔案路徑。
[defaults]<br>private_key_file = /path/to/id_rsa
become_user使用許可權提升(become: true)時要變更的使用者。預設會變更為root使用者,但可透過become_user變更。需要注意的是,此設定位於設定檔的不同標頭下:
[privilege_escalation]<br>become_user = admin
become_ask_pass使用become: true時,可能需要指定--ask-become-pass以使Ansible提示輸入sudo密碼。若需要提供sudo密碼,可設定become_ask_pass使Ansible始終提示:
[privilege_escalation]<br>become_ask_pass = True

設定檔範例

若建立包含上述所有選項的ansible.cfg檔案,其內容將如下所示:

[defaults]
nocows = 1
inventory = ./ec2.py
remote_port = 22345
gathering = explicit
remote_user = dedicateduser
private_key_file = /path/to/id_rsa

[privilege_escalation]
become_user = admin
become_ask_pass = True

串列執行

預設情況下,Ansible會平行對playbook中所參照的所有主機執行任務。若inventory包含十個主機,以下playbook將同時對所有主機執行mheap.demo角色:

---
- hosts: all
  roles:
    - mheap.demo

若此行為並非所期望,可指示Ansible一次僅對一定數量的主機執行任務,以避免同時使叢集中的所有成員離線:

---
- hosts: all
  serial: 3
  roles:
    - mheap.demo

透過新增serial: 3,可指示Ansible一次僅對三個主機執行任務。它將先對前三個主機執行任務,並等待所有任務完成後再繼續對接下來的三個主機執行。若偏好,也可將此值指定為百分比而非絕對數字:

---
- hosts: all
  serial: 40%
  roles:
    - mheap.demo

內容解密:

  1. serial關鍵字:控制playbook對主機執行的平行數量。
  2. 百分比設定:允許根據主機總數的百分比來控制平行度。
  3. 實際應用:在需要逐步更新或佈署的場景中非常有用,例如避免一次性讓整個叢集離線。

重點整理:

  • 使用ansible-galaxy delete可從Ansible Galaxy移除角色。
  • ansible.cfg可用於設定多項預設引數,如inventory檔案、遠端埠等。
  • serial關鍵字允許控制playbook對主機的平行執行數量。

探討 Ansible 的進階功能

批次執行與錯誤處理

在管理大量主機時,Ansible 提供了多種方式來控制執行的批次與錯誤處理機制。其中,serial 引數允許使用者指定每次執行任務的主機百分比,而 max_fail_percentage 則用於設定允許的最大失敗率。

範例組態

---
- hosts: all
  serial: 40%
  max_fail_percent: 10
  roles:
    - mheap.demo

在這個範例中,Ansible 將會先對 40% 的主機執行任務,接著是下一個 40%,最後是剩餘的 20%。如果超過 10% 的主機執行失敗,整個 play 將會被終止。

細節解析

  1. serial 引數的作用:控制 Ansible 每次執行任務的主機數量或百分比,讓管理大規模叢集時更加靈活。
  2. max_fail_percentage 的設定:決定了允許的最大失敗率。當實際失敗率超過設定的閾值時,Ansible 將停止繼續執行任務。
  3. 注意事項:設定的失敗百分比必須超過指定的值才會觸發終止。例如,若要在一半的主機失敗時終止,需要將 max_fail_percentage 設定為 49 而非 50。

使用 ansible-pull 自動化佈署

除了傳統的推播模式,Ansible 也支援使用 ansible-pull 讓各主機定期提取最新的組態變更。這需要在所有受控主機上安裝 Ansible,並設定定時任務。

安裝 Ansible 與設定 ansible-pull

  1. 安裝 Ansible:使用 Ansible 的 ad-hoc 模式在所有主機上安裝 Ansible。

    ansible all -i /path/to/inventory -m apt -a name=ansible
    
  2. 手動測試 ansible-pull

    ansible-pull -U [email protected]/ansible-site.git -i 'localhost,' –c 'local' playbook.yml
    
  3. 設定定時任務

    crontab -e
    

    新增以下行:

    [email protected]
    */30 * * * * ansible-pull -U [email protected]/ansible-site.git -i 'localhost,' –c 'local' playbook.yml
    

詳細解說

  1. ansible-pull 的基本用法:從指定的 Git 倉函式庫提取 Playbook 並執行。
  2. 設定定時任務:使用 crontab 設定 Ansible 每 30 分鐘自動執行一次 ansible-pull,並將輸出郵寄至指定信箱。
  3. 重定向輸出:若不需標準輸出,可重定向至 /dev/null 以避免郵件過多。

使用 Blocks 管理任務與錯誤處理

Ansible 從 2.0 版本開始支援 Blocks,讓使用者可以將多個任務邏輯分組,並統一設定許可權提升或條件判斷。

範例 Playbook

---
- hosts: all
  tasks:
    - block:
        - apt: name=apache2 state=installed
        - template: src=vhost.conf dest=/etc/apache2/sites-enabled/vhost.conf
      become: true
    - copy: src=s3.cfg dest=~/.s3.cfg

Blocks 的錯誤處理機制

Blocks 也提供了類別似其他程式語言中的 try/catch 語法,讓使用者可以捕捉並處理錯誤。

---
- hosts: all
  tasks:
    - block:
        - command: /bin/false
        - debug: msg="I will never run as the task above fails"
      rescue:
        - debug: msg="This will run because the block failed"
      always:
        - debug: msg="This runs no matter what happens"

詳細解析

  1. block 的基本用法:將需要以提升許可權執行的任務分組。
  2. rescuealways:當 block 中的任務失敗時,rescue 部分的任務將被執行,而 always 部分的任務無論如何都會執行。
  3. 錯誤處理的邏輯:利用傳回碼判斷任務是否成功,若傳回非零值則視為失敗並觸發 rescue 部分。

安裝 Ansible

Ansible 的安裝方式取決於所使用的作業系統。在 Linux 上,可以透過原始碼安裝或建立 Ansible 的套件版本進行安裝。本章節將介紹如何在根據 Debian 和 RedHat 的 Linux 系統上建立 Ansible,以及如何在 Windows 上安裝 Ansible。

在 Debian 上安裝 Ansible

Debian 既是一個 Linux 發行版家族的名稱,也是一個特定的 Linux 發行版名稱。如果您使用的是 Debian、Ubuntu 或 Linux Mint(或其他根據 Debian 的作業系統),可以按照本文的指示從原始碼安裝 Ansible。

從原始碼安裝

從原始碼安裝是取得最新版本 Ansible 的最簡單方法。要建立 Ansible,您需要先在機器上安裝一些開發套件。安裝所需的套件後,您將從 Github 複製 Ansible 的原始碼,並使用其 makefile 將 Ansible 安裝到您的機器上。

以下是從原始碼在根據 Debian 的機器上安裝 Ansible 所需的所有命令:

sudo apt-get update
sudo apt-get install build-essential git python-pip python-dev libffi-dev libssl-dev
sudo pip install setuptools --upgrade
git clone git://github.com/ansible/ansible.git --recursive
cd ansible
make
sudo make install

建立 .deb 套件

雖然從原始碼安裝可以安裝最新版本的 Ansible,但要解除安裝 Ansible 卻相當困難。因為 Ansible 在從原始碼安裝時只是將檔案複製到正確的目錄,所以沒有任何記錄顯示哪些檔案被建立(因此也不知道要刪除哪些檔案)。透過建立 Debian 套件(.deb 檔案),您可以利用與標準系統套件相同的安裝和移除工具。

從 Ansible 原始碼建立 .deb 檔案需要與從原始碼安裝相同的依賴套件,以及建立 .deb 套件所需的一些系統套件。以下命令將安裝所有所需的套件,並建立可用於安裝 Ansible 的 Debian 套件。

sudo apt-get update
sudo apt-get install build-essential git python-pip python-dev libffi-dev libssl-dev asciidoc devscripts debhelper cdbs
sudo pip install setuptools --upgrade
git clone git://github.com/ansible/ansible.git --recursive
cd ansible
make deb

完成 make deb 命令後,您可以使用以下命令找到您建立的 Debian 套件:

$ find . -name "*.deb"
./deb-build/unstable/ansible_2.2.0-0.git201607051907.d0ccedc.devel~unstable_all.deb

在安裝此套件之前,您需要透過執行以下命令來安裝 Ansible 所需的一些依賴套件:

sudo apt-get install python-jinja2 python-paramiko sshpass python-markupsafe

安裝完所有所需的依賴套件後,您可以從剛剛建立的 Debian 套件安裝 Ansible:

$ sudo dpkg -i ./deb-build/unstable/ansible_2.2.0-0.git201607051907.d0ccedc.devel~unstable_all.deb

此時,您可以執行 ansible --version 來確認 Ansible 已安裝。

內容解密:

  1. sudo apt-get update 更新套件列表,以確保您安裝的是最新版本的套件。
  2. sudo apt-get install build-essential git python-pip python-dev libffi-dev libssl-dev 安裝建立 Ansible 所需的基本開發工具和函式庫。
  3. sudo pip install setuptools --upgrade 更新 setuptools,以確保 Python 環境已準備好進行 Ansible 的建立。
  4. git clone git://github.com/ansible/ansible.git --recursive 從 Github 複製 Ansible 的原始碼倉函式庫。
  5. cd ansible 切換到 Ansible 原始碼目錄。
  6. makesudo make install 使用 Makefile 建立並安裝 Ansible。
  7. make deb 建立 Debian 套件(.deb 檔案),以便於使用系統的套件管理工具進行安裝和解除安裝。

在 RedHat 上安裝 Ansible

與 Debian 類別似,RedHat 既是一個特定的 Linux 版本(RedHat Enterprise Linux,通常稱為 RHEL),也是一個從它衍生出來的作業系統家族,例如 CentOS 和 Fedora。用於建立和安裝 Ansible 的命令不同,但過程是相同的。

內容解密:

  1. 不同發行版的差異: RedHat 和 Debian 系列的 Linux 發行版在套件管理和依賴套件上有所不同,因此需要使用不同的命令來安裝和建立 Ansible。
  2. 相同的流程: 無論是在 Debian 還是在 RedHat 上,基本的流程都是先安裝依賴套件,然後取得 Ansible 原始碼,最後建立並安裝 Ansible。