Ansible 是一款功能強大的自動化工具,讓開發者和系統管理員能以更有效率的方式管理伺服器組態。不同於傳統的手動組態或 shell 指令碼,Ansible 採用 playbook 的方式,以 YAML 語法描述伺服器的目標狀態,並自動執行必要的指令,確保組態的一致性和可重複性。這有效解決了「雪花伺服器」的問題,讓每台伺服器的組態都易於管理和重現。Ansible 使用 SSH 連線到目標伺服器,無需安裝額外軟體,輕量且易於佈署。此外,它能直接執行 shell 命令,讓現有指令碼也能逐步整合到 Ansible 的自動化流程中。對於初學者,建議先在本地環境中使用 Vagrant 和 VirtualBox 建立虛擬伺服器進行測試,避免直接操作正式環境。透過 Vagrant,可以快速建立和管理虛擬機器,並結合 Ansible playbook 進行自動化組態。如此一來,可以安全地在本地測試各種組態,待驗證無誤後再佈署到正式環境,有效降低風險並提升佈署效率。
Ansible:無縫管理與自動化的終極工具
在當今的IT環境中,管理與維護伺服器的組態是一項具有挑戰性的任務。傳統上,許多系統管理員和開發者依賴手動組態和 shell 指令碼來管理伺服器,這往往導致「雪花伺服器」的問題,即每台伺服器的組態都獨一無二且難以重現。為了應對這一問題,Ansible 以其簡單易用的設計和強大的功能,成為現代 DevOps 的必備工具。
Ansible 的優勢
Ansible 的設計初衷是讓開發者和系統管理員能夠以熟悉的方式來管理伺服器,同時又能夠確保組態的一致性和可重複性。Ansible 的最大優勢之一是其能夠直接執行 shell 命令,這意味著你可以將現有的指令碼逐步轉換成 idempotent(冪等)的 playbook,而無需學習新的組態語言。
此外,Ansible 不需要在目標伺服器上安裝任何額外的軟體,這使得它在資源消耗和管理上都非常高效。與其他組態管理工具(如 Puppet 或 Chef)不同,Ansible 使用 SSH 來推播變更,這使得它更加輕量且易於佈署。
安裝 Ansible
在開始使用 Ansible 之前,首先需要安裝 Python。Python 是 Ansible 的唯一依賴項。安裝 Python 後,可以使用 pip 來安裝 Ansible。以下是在不同作業系統上的安裝步驟:
macOS
# 檢查 pip 是否已安裝
which pip
# 如果未安裝,則安裝 pip
sudo easy_install pip
# 安裝 Ansible
pip install ansible
Windows
在 Windows 上安裝 Ansible 需要一些額外的步驟。通常建議使用 Windows Subsystem for Linux(WSL)來執行 Ansible。
Linux
大多數 Linux 發行版都已經預先安裝了 Python 和必要的開發工具。你可以使用 pip 來安裝 Ansible:
# 安裝 Ansible
pip install ansible
# 更新 Ansible
pip install --upgrade ansible
Fedora/RHEL/CentOS
可以使用 dnf 或 yum 來安裝 Ansible:
# 安裝 EPEL 函式庫(如果尚未安裝)
sudo yum install epel-release
# 安裝 Ansible
sudo yum install ansible
Debian/Ubuntu
可以使用 apt 來安裝 Ansible:
# 新增 Ansible 的 PPA
sudo apt-add-repository -y ppa:ansible/ansible
# 更新套件清單並安裝 Ansible
sudo apt-get update
sudo apt-get install -y ansible
# 檢查是否已成功安裝
ansible --version
基本清單檔案的建立
Ansible 使用清單檔案來管理伺服器群組。這類別似於 /etc/hosts 檔案,但更具靈活性。以下是如何建立一個基本的清單檔案:
- 建立一個測試專案目錄並進入該目錄:
mkdir test-project
cd test-project
touch hosts.ini
- 編輯
hosts.ini檔案並新增以下內容:
[example]
www.example.com
其中 example 是伺服器群組名稱,www.example.com 是群組中的一台伺服器。
如果你使用的是非預設的 SSH 港口(例如2222),則需要在地址後指定埠號:
[example]
www.example.com:2222
使用 Ansible 進行基礎組態管理
設定您的第一個 Ansible 環境
首先,我們假設您已經有一台可用的伺服器來進行測試。如果您還沒有,可以考慮使用 DigitalOcean、Amazon Web Services 或 Linode 等服務建立一個小型虛擬機器(VM)。這樣,您就有了一個完整的伺服器環境來學習 Ansible,而且測試完成後可以刪除伺服器,只需支付少量費用。
將範例中的 www.example.com 替換為您伺服器的名稱或 IP 地址。您也可以將清單(inventory)放在 Ansible 的全域性清單檔案 /etc/ansible/hosts 中,任何未指定其他清單的遊戲本(playbook)都會預設使用該檔案。然而,該檔案需要 sudo 許可權,通常最好將清單與 Ansible 專案一起維護。
執行您的第一個 Ad-Hoc Ansible 命令
安裝完 Ansible 並建立了清單檔案後,是時候執行一些命令來檢查是否一切正常。在終端中輸入以下命令(我們會做一些安全的操作,這樣不會對伺服器進行任何更改):
ansible -i hosts.ini example -m ping -u [username]
其中 [username] 是您用來登入伺服器的使用者名稱。如果一切正常,您應該會看到一條顯示 www.example.com | SUCCESS >> 的訊息,然後是 ping 的結果。如果失敗了,再次執行命令並新增 -vvvv 以檢視詳細輸出。很可能是 SSH 金鑰未正確組態——如果您透過 ssh username@www.example.com 登入並成功,則上述 Ansible 命令應該也能成功。
Ansible 假設您使用無密碼(根據金鑰的)登入進行 SSH(例如,您透過輸入 ssh username@example.com 登入且不需要輸入密碼)。如果您仍然使用使用者名稱和密碼登入到遠端伺服器,或者需要了解 Linux 的遠端身份驗證和安全最佳實踐,請閱讀《第 11 章 - 伺服器安全與 Ansible》。如果堅持使用密碼,請在 Ansible 命令中新增 --ask-pass (-k) 標誌(您可能還需要安裝 sshpass 包)。這整本文都假設使用無密碼驗證,因此每次執行命令或遊戲本時都需要記住這一點。
需要了解 SSH 金鑰驗證的基礎知識?請參閱 Ubuntu 社群關於 SSH/OpenSSH/Keys 的檔案。
讓我們執行一個更有用的命令:
ansible -i hosts.ini example -a "free -h" -u [username]
在這個例子中,我們快速查看了所有伺服器(目前只有一台)的記憶體使用情況(以人類可讀的格式)。這類別命令對於快速找到值異常的伺服器非常有幫助。我經常使用像 free -h(檢視記憶體統計資訊)、df -h(檢視磁碟使用統計資訊)等命令來確保我的伺服器沒有異常行為。雖然跟蹤這些細節在外部工具如 Nagios、Munin 或 Cacti 中是很好的做法,但能夠在一個簡單命令和一個終端視窗中檢查所有伺服器上的這些統計資訊也是很棒的。
摘要
至此,您已經學會了組態管理和 Ansible 的基本概念,安裝了它們,告訴它們關於您的伺服器,並透過 Ansible 在伺服器上執行了一些命令。如果您還沒有被打動,沒關係——您只看到冰山一角。
本地基礎架構開發:Ansible 和 Vagrant
本地虛擬機器進行原型設計和測試
Ansible 可以與任何您能連線到的伺服器(遠端或本地)良好協作。為了加快 Ansible 遊戲本的測試和開發速度以及一般測試工作,最好在本地進行操作。本地開發和測試基礎架構比在遠端/實際機器上(特別是在生產環境中)更安全和更快。
在過去十年裡,測試驅動開發(TDD),無論以何種形式出現,已經成為軟體行業的一種規範。而基礎架構開發則尚未組織起來,直到最近才成為如此重要的部分。最佳實踐規定要對基礎架構進行徹底測試——這對於執行於其上的軟體而言至關重要。
軟體變更要麼手動測試要麼自動化測試;現在已經有系統可以與 Ansible 和其他佈署及組態管理工具整合,以允許一定程度上的基礎架構測試。即使僅僅是在應用更改到生產環境之前先在本地測試一下組態更改也是千倍於軟體開發世界中所謂「牛仔編碼」要好的做法——直接在生產環境中工作、不記錄或將變更封裝到程式碼中以及沒有回復到以前版本的方法。
過去十年見證了許多虛擬化工具的興起,這些工具允許從本地工作站進行靈活且強大的基礎架構模擬!在沒有破壞重要伺服器之虞下反覆完善組態檔案或調整伺服器更新順序是令人振奮的一件事。如果使用本地虛擬機器,則無需重建伺服器時停機時間;只需在新 VM 上重新執行組態即可在幾分鐘內還原營運——而無人察覺。
流程圖示
graph TD
D[D]
A[準備環境] --> B[設定清單檔案]
B --> C[執行 Ad-Hoc 命令]
C --> D{成功嗎?}
D -- 是 --> E[執行實際命令]
D -- 否 --> F[檢查 SSH 金鑰設定]
F --> G[修正問題]
G --> C
小段落標題:流程圖示解說
此圖示展示了從準備環境到執行實際命令的一系列步驟。
- 準備環境:確保有可用的伺服器進行測試。
- 設定清單檔案:建立或修改清單檔案以包含目標伺服器資訊。
- 執行 Ad-Hoc 命令:使用
ansible命令進行初步測試。 - 檢查結果:根據結果決定是否繼續或修正問題。
- 修正問題:如遇到問題(如 SSH 金鑰未正確組態),則進行修正。
- 執行實際命令:成功後執行所需的實際命令。
本地虛擬機器組態案例
以下是一個簡單的 Vagrantfile 建構範例:
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/bionic64"
config.vm.network "private_network", type: "dhcp"
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
vb.cpus = 2
end
config.vm.provision "ansible" do |ansible|
ansible.playbook = "provision.yml"
ansible.inventory_path = "hosts.ini"
end
end
您可能希望把上面的一些值替換成符合自己需求:
config.vm.box:指定 Vagrant 用來建立 VM 的盒子。config.vm.network: 指定網路設定。config.vm.provider: 指定 VM 提供者及其設定。config.vm.provision: 組態 Vagrant 用來自動化 VM 的方式。
組態檔案內容解密:
Vagrant.configure("2") do |config|
此段程式碼開始組態 Vagrantfile 的版本為2。
config.vm.box = "ubuntu/bionic64"
此段程式碼指定 Vagrant 用來建立虛擬機器(VM)的盒子名稱為 "ubuntu/bionic64"。
config.vm.network "private_network", type: "dhcp"
此段程式碼設定虛擬機器使用私有網路並透過 DHCP 功能自動取得 IP 地址。
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
vb.cpus = 2
end
此段程式碼指定虛擬機器將使用 VirtualBox 作為提供者並分配1024MB記憶體及2個 CPU核心。
config.vm.provision "ansible" do |ansible|
ansible.playbook = "provision.yml"
ansible.inventory_path = "hosts.ini"
end
此段程式碼指定使用Ansible作為組態工具並傳入專案內所需執行之playbook及主機清單檔案名稱。
摘要
這樣的一些基本概念就可以幫助玄貓利用Ansible及Vagrant達到快速搭建分散式環境作為後續研發及範例演示之用途。
使用 Vagrant 與 VirtualBox 來簡化測試 Ansible 的伺服器組態
Vagrant 和 VirtualBox 是兩個強大的工具,它們的結合可以讓我們在本地環境中輕鬆測試基礎設施和伺服器組態。這兩個工具都是開源的,並且可以在 Mac、Linux 和 Windows 上無縫執行。玄貓將帶領大家一步步設定 Vagrant 和 VirtualBox,並使用 Ansible 來組態新的伺服器。
建立第一個本地伺服器:Vagrant 設定
首先,我們需要下載並安裝 Vagrant 和 VirtualBox,並建立一個簡單的 Vagrantfile 來描述虛擬伺服器。以下是詳細步驟:
-
下載並安裝 Vagrant 和 VirtualBox:根據你的作業系統選擇適當的版本進行下載和安裝。安裝 VirtualBox 時,請確保選擇安裝命令列工具,以便 Vagrant 能夠與之配合工作。
-
建立專案資料夾:在硬碟上選擇一個位置建立一個新資料夾,用來存放你的 Vagrantfile 和組態指令。
-
開啟終端機或 PowerShell:導航到你剛剛建立的資料夾。
-
新增 Rocky Linux 8.x 64-bit ‘box’:使用以下命令新增 Rocky Linux 8 的預設虛擬機器影像:
vagrant box add geerlingguy/rockylinux8HashiCorp 的 Vagrant Cloud 提供了許多不同的預製 Linux box,還有官方提供的 Ubuntu box。這些資源可以在 Vagrant 的檔案中找到。
-
建立預設虛擬伺服器組態:使用剛剛下載的 box 建立虛擬機器組態:
vagrant init geerlingguy/rockylinux8 -
啟動 Rocky Linux 伺服器:使用以下命令啟動虛擬機器:
vagrant upVagrant 會下載一個預先構建的 64-bit Rocky Linux 8 虛擬機器影像,並根據 Vagrantfile 中的組態將其載入到 VirtualBox 中。接著,虛擬機器會自動啟動。
虛擬伺服器管理
管理這個虛擬伺服器非常簡單:
vagrant halt:關閉虛擬機器。vagrant up:啟動虛擬機器。vagrant destroy:完全刪除虛擬機器。vagrant up:再次從基礎 box 建立虛擬機器。
你可以透過 SSH 連線到這個虛擬伺服器,就像連線到任何其他伺服器一樣。要連線,請在包含 Vagrantfile 的資料夾中執行以下命令:
vagrant ssh
如果你想手動連線或從其他應用程式連線,可以使用以下命令取得所需的 SSH 認證:
vagrant ssh-config
Vagrant 與 Ansible 的結合
Vagrant 不僅能夠快速啟動預組態的 box,還有許多其他強大功能。例如:
- 網路介面管理:可以將埠轉發到 VM、分享公共網路連線或使用私有網路進行 VM 與主機之間的通訊。
- 分享資料夾管理:Vagrant 可以透過 NFS 或原生資料夾分享(在 VirtualBox 中較慢)來設定主機與 VM 之間的分享。
- 多機管理:Vagrant 能夠在一個 Vagrantfile 中組態和控制多個 VM。
- 組態管理:當首次執行
vagrant up時,Vagrant 會根據 Vagrantfile 中的組態自動進行組態。你也可以在 VM 建立後明確執行vagrant provision命令。
組態 Ansible
Ansible 是許多與 Vagrant 整合的組態管理工具之一(其他還包括基本 shell 指令碼、Chef、Docker、Puppet 和 Salt)。當你呼叫 vagrant provision 或首次執行 vagrant up 時,Vagrant 會將 VM 操作權交給 Ansible,並告訴它執行指定的 Ansible playbook。讓我們編輯 Vagrantfile 來使用 Ansible 組態我們的虛擬機器。
開啟你之前建立的 Vagrantfile,並在結尾處新增以下內容:
# Provisioning configuration for Ansible.
config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook.yml"
end
這是一個非常基本的組態,讓我們開始使用 Ansible 與 Vagrant。稍後我們會探討更多 Ansible 的選項和功能。
建立第一個 Ansible Playbook
現在讓我們建立一個名為 playbook.yml 的 Ansible playbook 檔案。在與 Vagrantfile 相同的資料夾中建立一個空白文字檔案,並新增以下內容:
---
- hosts: all
become: yes
tasks:
- name: Ensure chrony (for time synchronization) is installed.
yum:
name: chrony
state: present
- name: Ensure chrony is running.
service:
name: chronyd
state: started
enabled: yes
內容解密:
---\n- hosts: all\nbecome: yes: 第一行是 YAML 語法標記符號,表示後續內容都將以 YAML 語法書寫。第二行指定此 playbook 應用於所有主機(由於我們使用的是 Vagrant 自動生成的 inventory),第三行告知 Ansible 在執行任務時需要 sudo 許可權。- name: Ensure chrony (for time synchronization) is installed.\nyum:\n name: chrony\n state: present: 安裝 chrony 軟體包(用於時間同步),此任務等同於執行yum install chrony指令。- name: Ensure chrony is running.\n service:\n name: chronyd\n state: started\n enabled: yes: 檢查 chrony 槽位是否啟動且啟用開機自啟動狀態。
執行 Playbook
確保你在包含 Vagrantfile 和新建立的 playbook.yml 檔案的目錄中執行以下命令來執行 playbook:
vagrant provision
你應該會看到每個任務執行狀態訊息以及最後的一份總結報告:
PLAY RECAP **********************************************************
default : ok=3 changed=0 unreachable=0 failed=0
Ansible 已經解析了你所定義的簡單 playbook 中的 YAML 語法,並透過 SSH 執行了一系列命令來按照你指定的方式組態伺服器。
這樣我們就完成了使用 Vagrat 和 Ansible 組態本地伺服器的一整套流程!希望這篇文章能幫助你更好地理解如何利用這些工具來進行測試和佈署。