什么是 Ansible?Ansible 是一款功能強大且易于使用的現代應用程序部署和配置管理工具。它使得從單個控制節點處理數以千計的遠程服務器(也稱為受管節點)變得容易。Ansible 允許您輕松地重現配置環境,并避免您登錄到單個服務器并一臺一臺地配置它們。
即使在 Ansible 中跟蹤數以千計的遠程服務器也可能變得很麻煩,因此了解如何使用稱為清單文件的特殊文件對托管節點進行分組和定位至關重要。
什么是 Ansible 庫存文件?
Ansible 清單文件允許系統管理員跟蹤他們管理的遠程系統。默認清單文件稱為hosts文件,位于/etc/ansible目錄中。這是指定所有受管遠程節點的地方。
Ansible 還使您可以靈活地在控制節點上的首選位置創建自定義清單文件以滿足您的偏好。當您擁有復雜的環境并且需要將受管節點隔離到單獨的清單文件而不是將它們全部放在hosts文件中時,這是理想的選擇。
在本指南中,您將安裝 Ansible 并在控制節點上設置自定義清單文件。
先決條件
為了演示如何在清單文件中定義遠程服務器,我們將使用以下設置,其中所有服務器都部署了 Ubuntu 20.04 操作系統:
Ansible 控制節點:這是安裝 Ansible 的服務器。它用于通過 SSH 連接到您的托管節點并管理它們。
托管節點:這些是將從 Ansible 控制節點管理的遠程節點:
節點 1:?198.148.118.68
節點 2:?198.148.118.129
我們的小型實驗室設置足以說明您如何使用 Ansible 清單文件來管理您的遠程系統。但是,您可以擁有的托管節點的數量沒有限制。
在 Ubuntu 20.04 上安裝 Ansible
我們的第一步是在控制節點上安裝 Ansible。因此,通過 SSH 或使用免費的 SSH 客戶端(如PuTTY?)登錄到您的控制節點。
登錄后,通過運行以下命令更新系統包列表。-y 選項自動假定“是”作為對所有命令行提示的回答。
sudo apt update
接下來,安裝 Ansible:
sudo apt install -y ansible
這將安裝 Ansible 和許多其他附加包和依賴項。完成后,通過檢查 Ansible 的版本來驗證是否安裝了 Ansible:
ansible –-version
下面的輸出證明我們已經成功安裝了 Ansible 2.9.6 版本。
如前所述,默認清單文件位于 /etc/ansible/hosts。使用首選命令行編輯器打開文件后,您將看到一些關于預期內容的基本指南。
sudo nano /etc/ansible/hosts
# This is the default ansible 'hosts' file. # # It should live in /etc/ansible/hosts # # - Comments begin with the '#' character # - Blank lines are ignored # - Groups of hosts are delimited by [header] elements # - You can enter hostnames or ip addresses # - A hostname/ip can be a member of multiple groups # Ex 1: Ungrouped hosts, specify before any group headers: ## green.example.com ## blue.example.com ## 192.168.100.1 ## 192.168.100.10 # Ex 2: A collection of hosts belonging to the 'webservers' group: ## [webservers] ## alpha.example.org ## beta.example.org ## 192.168.1.100 ## 192.168.1.110
默認情況下,所有條目都被注釋掉并且沒有指定主機。在下一步中,您將連接到遠程主機并創建自定義清單文件。
設置無密碼 SSH 連接
Ansible 是一種無代理部署工具,它使用 SSH 協議與遠程節點進行通信。為了無縫地實現這一點,我們需要采取額外的步驟,在 Ansible 控制節點和遠程系統之間配置一個無密碼的 SSH 連接。
首先,使用以下命令生成 SSH 密鑰對:
ssh-keygen
它將創建一個 SSH 密鑰對,其中包含存儲在您主目錄的 .ssh/ 文件夾中的公鑰和私鑰。
私鑰應保留在 Ansible 控制節點上,絕不能泄露或與任何人共享,以避免中間人攻擊等安全漏洞。另一方面,您可以輕松地與您選擇的任何遠程系統共享公鑰。
要成功配置無密碼 SSH 連接,您需要將公鑰復制到遠程節點。ssh-copy-id您可以使用所示語法中的命令輕松執行此操作:
ssh-copy-id user@server-ip-address
在我們的例子中,命令將是:
ssh-copy-id root@198.148.118.68
出現提示時輸入遠程系統的密碼,然后按 ENTER 鍵將公鑰復制到服務器。
為了驗證我們是否可以在沒有密碼身份驗證的情況下登錄到遠程系統,我們將嘗試通過 SSH 登錄,方法是證明用戶名后跟“@”,然后是遠程節點的 IP 地址。
ssh root@198.148.118.68
下面提供的代碼片段是對我們剛剛在沒有密碼的情況下登錄到遠程 node1 的確認。
公鑰保存在~/.ssh/authorized_keys遠程節點的文件中。
您可以仔細檢查它是否存在:
cat ~/.ssh/authorized_keys
對所有節點重復相同的過程,并確保您可以在沒有密碼身份驗證的情況下通過 SSH 連接到它們。
創建自定義庫存文件
Ansible 使用位于的默認清單文件來引用托管節點,除非您通過該選項/etc/ansible/hosts指定自定義清單文件。-i
默認的清單文件工作得很好。實際上,您可以使用遠程節點的 IP 地址將其放入其中,如下所示:
198.148.118.68 198.148.118.129
然后,您可以在遠程節點上執行 ping 模塊,而無需明確指定遠程主機:
sudo ansible -m ping all
當然,這沒有任何問題,但是當面對不同項目下的多個托管節點時,最佳做法是為每個項目創建單獨的清單文件。通過這種方式,您將促進資源跟蹤并更輕松地與其他系統管理員協作,而無需讓每個人都糾結在一個hosts文件中。
現在,讓我們創建一個自定義清單文件。為此,您應該首先創建一個項目目錄并導航到其中:
mkdir project_dir && cd project_dir
接下來,創建一個簡單的文本文件。您可以給它任意名稱:
nano inventory
然后使用它們的 IP 地址每行列出您的托管節點:
198.148.118.68 198.148.118.129
保存更改并退出文件。ansible-inventory現在您可以使用命令驗證托管主機。請注意,使用該-i選項時必須引用清單文件的完整路徑。
ansible-inventory -i project_dir/inventory --list
從這里,您可以使用自定義清單文件在托管主機上執行劇本或 ping 模塊:
sudo ansible -i project_dir/inventory -m ping all
將節點組織成組和子組
為了更清晰的清單文件和更輕松地管理您的受管節點,通常建議將它們組織成組和子組。
一臺主機可以屬于一個或多個組。在下面的示例中,我們webservers以 INI 格式將 2 臺主機分組到該組下。
[webservers] 198.148.118.68 198.148.118.129
下面的清單文件更好地說明了多臺服務器被分為不同的組,例如webservers,load_balancers和db_servers.
[webservers] 198.148.118.68 198.148.118.129 198.148.118.150 198.148.118.175 [load_balancers] 198.148.118.100 198.148.118.200 [db_servers] 198.148.118.50 198.148.118.60
再次運行ansible-inventory命令,您應該會看到與此處類似的安排:
ansible-inventory -i project_dir/inventory --list
您還可以將多個組定義為“父”組下的“子”組。在這種情況下,“父”組成為元組。以下是如何使用元組重新組織以前的清單的說明:
[childgroup1] node1 node2 [childgroup2] node3 node4 [parent1:children] childgroup1 childgroup2
考慮到這一點,我們可以重新組織我們的庫存,如下所示。
[webservers_miami] 198.148.118.68 198.148.118.129 [webservers_virginia] 198.148.118.150 198.148.118.175 [load_balancer_ohio] 198.148.118.100 [load_balancer_texas] 198.148.118.200 [db_server_miami] 198.148.118.50 [db_server_virginia] 198.148.118.60 [webservers:children] webservers_miami webservers_virginia [load_balancers:children] load_balancer_ohio load_balancer_texas [db_servers:children] db_server_miami db_server_virginia
再次,您可以按如下方式驗證庫存清單:
ansible-inventory -i project_dir/inventory --list
這樣的安排可以幫助您使用劇本來定位較小的服務器組,而不是一次定位所有節點。例如,您可以在[webservers_miami]子組中執行 ping 模塊,如下所示:
sudo ansible -i project_dir/inventory -m ping webservers_miami
使用模式來定位命令的執行
使用 Ansible 運行劇本或臨時命令時,您需要提供通常在清單文件中定義的目標。模式可以靈活地定位清單文件中的特定主機或組。它們支持通配符、正則表達式等等。
為了演示如何使用模式,請考慮下面的清單文件:
[webservers] 198.148.118.68 198.148.118.129 198.148.118.160 [db_servers] 198.148.118.55 198.148.118.110 [staging] 198.148.118.160 198.148.118.110 [production] 198.148.118.68 198.148.118.129 198.148.118.55
假設您要執行一個僅針對生產環境中運行的 Web 服務器的臨時命令。在此清單中,只有兩個網絡服務器符合此條件:198.148.118.68和198.148.118.129。
您可以簡單地使用以下匹配模式,而不是分別針對兩個目標主機:
sudo ansible webservers:\&production -m ping
& 符號 - & - 表示邏輯運算 AND。這意味著有效的主機必須在兩個組中,即webservers和production。由于這是一個臨時命令,我們需要\在命令中插入轉義符。
要定位webservers組中但不在 中的主機production,請使用以下模式:
sudo ansible webservers:\!production -m ping
此處,!符號表示邏輯運算符 NOT,它表示有效主機不得包含在production組中。再一次,我們需要包含\轉義字符,因為我們正在運行一個必須由 shell 解釋的臨時命令。
下表提供了在使用 Ansible 自動化工具運行臨時命令和劇本時可以使用的其他模式。
圖案 | 目標 |
---|---|
all | 清單文件中的所有目標 |
node1 | 單個節點或主機 (?node1) |
node1:node2 | 和node1_node2 |
group1 | group1僅適用于所有主機 |
group1:group2 | 適用于所有group1主機group2 |
group1:\&group2 | 兩者兼有的主機或group1服務器group2 |
group1:\&group2 | 主機或服務器在group1但不在group2 |
配置主機別名
別名是引用受管節點的一種簡單方法。就像昵稱一樣,它們可以幫助您輕松識別您的資源,而無需在運行劇本時回憶復雜的名稱。
要定義別名,只需指定一個別名,后跟一個與遠程主機的主機名或 IP 相對應的變量名。
alias variable_name
例如:
primary_server ansible_host=198.148.118.68` secondary_server ansible_host=198.148.118.129`
然后驗證清單列表以檢查節點是否被別名引用。
ansible-inventory -i project_dir/inventory --list
從輸出中我們可以看到服務器現在被它們的別名所引用。您還可以通過使用別名引用節點來運行臨時命令:
sudo ansible -i project_dir/inventory -m ping primary_server
配置變量名稱
在 Ansible 中,變量用于處理托管主機之間的差異。使用變量,您可以在執行劇本或臨時命令時表示系統之間的差異。例如,在上一節中,我們使用了ansible_host簡單地告訴 Ansible 在哪里搜索托管節點的 IP 地址的變量。
在清單文件中,您可以使用變量來定義主機名、連接類型、端口等。在下面的示例中,我們進一步定義了用于啟動到節點的遠程連接的用戶。
在這種情況下,我們有兩個變量:ansible_host指定主機的 IP,以及ansible_user指定用于連接遠程主機的用戶。
server01 ansible_host=198.148.118.68 ansible_user=root server02 ansible_host=198.148.118.129 ansible_user=user
此外,您還可以創建主機組并在組級別具有變量。在這個例子中,我們有兩個獨立的變量組——[webservers_a:vars]它們[webservers_b:vars]定義了連接到被管節點的用戶。
[webservers_a] server01 ansible_host=198.148.118.68 [webservers_b] server02 ansible_host=198.148.118.129 [webservers_a:vars] ansible_user=root [webservers_b:vars] ansible_user=user
結論
在本教程中,我們深入研究了 Ansible 清單,并演示了如何將托管主機組織成組和子組。然后我們更進一步,演示了如何使用模式來定位特定的主機組,觸及別名,最后用允許某些關鍵參數因主機而異的變量結束。