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檔案中的資訊,如標籤和平台。
準備發布角色
在發布角色之前,需要完成以下步驟:
- 編寫角色並實作所需任務。
- 將角色上傳到Github。
- 使用
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
內容解密:
serial關鍵字:控制playbook對主機執行的平行數量。- 百分比設定:允許根據主機總數的百分比來控制平行度。
- 實際應用:在需要逐步更新或佈署的場景中非常有用,例如避免一次性讓整個叢集離線。
重點整理:
- 使用
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 將會被終止。
細節解析
serial引數的作用:控制 Ansible 每次執行任務的主機數量或百分比,讓管理大規模叢集時更加靈活。max_fail_percentage的設定:決定了允許的最大失敗率。當實際失敗率超過設定的閾值時,Ansible 將停止繼續執行任務。- 注意事項:設定的失敗百分比必須超過指定的值才會觸發終止。例如,若要在一半的主機失敗時終止,需要將
max_fail_percentage設定為 49 而非 50。
使用 ansible-pull 自動化佈署
除了傳統的推播模式,Ansible 也支援使用 ansible-pull 讓各主機定期提取最新的組態變更。這需要在所有受控主機上安裝 Ansible,並設定定時任務。
安裝 Ansible 與設定 ansible-pull
安裝 Ansible:使用 Ansible 的 ad-hoc 模式在所有主機上安裝 Ansible。
ansible all -i /path/to/inventory -m apt -a name=ansible手動測試
ansible-pull:ansible-pull -U [email protected]/ansible-site.git -i 'localhost,' –c 'local' playbook.yml設定定時任務:
crontab -e新增以下行:
[email protected] */30 * * * * ansible-pull -U [email protected]/ansible-site.git -i 'localhost,' –c 'local' playbook.yml
詳細解說
ansible-pull的基本用法:從指定的 Git 倉函式庫提取 Playbook 並執行。- 設定定時任務:使用
crontab設定 Ansible 每 30 分鐘自動執行一次ansible-pull,並將輸出郵寄至指定信箱。 - 重定向輸出:若不需標準輸出,可重定向至
/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"
詳細解析
block的基本用法:將需要以提升許可權執行的任務分組。rescue與always:當block中的任務失敗時,rescue部分的任務將被執行,而always部分的任務無論如何都會執行。- 錯誤處理的邏輯:利用傳回碼判斷任務是否成功,若傳回非零值則視為失敗並觸發
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 已安裝。
內容解密:
sudo apt-get update: 更新套件列表,以確保您安裝的是最新版本的套件。sudo apt-get install build-essential git python-pip python-dev libffi-dev libssl-dev: 安裝建立 Ansible 所需的基本開發工具和函式庫。sudo pip install setuptools --upgrade: 更新setuptools,以確保 Python 環境已準備好進行 Ansible 的建立。git clone git://github.com/ansible/ansible.git --recursive: 從 Github 複製 Ansible 的原始碼倉函式庫。cd ansible: 切換到 Ansible 原始碼目錄。make和sudo make install: 使用 Makefile 建立並安裝 Ansible。make deb: 建立 Debian 套件(.deb 檔案),以便於使用系統的套件管理工具進行安裝和解除安裝。
在 RedHat 上安裝 Ansible
與 Debian 類別似,RedHat 既是一個特定的 Linux 版本(RedHat Enterprise Linux,通常稱為 RHEL),也是一個從它衍生出來的作業系統家族,例如 CentOS 和 Fedora。用於建立和安裝 Ansible 的命令不同,但過程是相同的。
內容解密:
- 不同發行版的差異: RedHat 和 Debian 系列的 Linux 發行版在套件管理和依賴套件上有所不同,因此需要使用不同的命令來安裝和建立 Ansible。
- 相同的流程: 無論是在 Debian 還是在 RedHat 上,基本的流程都是先安裝依賴套件,然後取得 Ansible 原始碼,最後建立並安裝 Ansible。