Ansible 已經成為現代基礎設施管理的根本,擺脫了傳統 Shell 指令碼的繁瑣和易錯性,讓組態管理變得更具可重複性和一致性。從安裝 Ansible 到撰寫第一個 Ad-Hoc 命令,入門門檻相當低。透過定義清單檔案,可以輕鬆管理多台伺服器,並利用平行處理提升效率。此外,結合 Vagrant 可以快速搭建本地開發環境,方便測試和驗證 Ansible 的組態。Playbook 作為 Ansible 的核心功能,能以 YAML 格式描述複雜的佈署流程,從安裝軟體、設定服務到佈署應用程式,都能夠自動化完成。Rocky Linux Node.js 伺服器的 Playbook 範例清楚地展示了 Ansible 的實力,涵蓋了從新增儲存函式庫、安裝套件到啟動服務的完整流程。更進一步,Ansible Galaxy 提供了豐富的社群資源,讓使用者可以方便地分享和使用現成的角色和模組,避免重複造輪子。而自訂角色的建立機制,則賦予了 Ansible 更高的靈活性,讓使用者可以根據自身需求開發專屬的自動化解決方案。
自動化DevOps:Ansible的應用與實踐
開啟新世代基礎設施管理
Ansible 為現代 DevOps 工具箱中的重要一環,能夠大幅提升基礎設施管理的效率與穩定性。它不僅簡化了組態管理的流程,還提供了強大的自動化功能,讓系統管理員和開發者能夠專注於更具價值的工作。本文將探討 Ansible 的基本概念、實踐技巧以及其在現代 DevOps 中的應用。
Ansible與基礎設施管理
雪花伺服器與Shell指令碼
在傳統的基礎設施管理中,每台伺服器往往都有其獨特的組態,這些獨特的組態被稱為「雪花伺服器」。這種情況下,管理者常需依賴 Shell 指令碼來進行組態管理。然而,Shell 指令碼通常缺乏可重複性和一致性,容易導致錯誤和難以維護。
組態管理工具的興起
隨著 DevOps 文化的興起,組態管理工具如 Chef、Puppet 和 Ansible 逐漸成為主流。這些工具能夠自動化組態管理流程,確保所有伺服器的一致性和可重複性。
安裝與初始設定
安裝Ansible
在開始使用 Ansible 前,首先需要安裝它。Ansible 支援多種作業系統,以下是在 Ubuntu 上安裝 Ansible 的步驟:
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
內容解密:
- 更新系統套件列表:
sudo apt update
會更新系統中的套件列表,確保安裝最新版本的套件。 - 安裝必要套件:
software-properties-common
提供了一些軟體屬性工具,這些工具可以用來管理 PPA(Personal Package Archive)。 - 新增 Ansible PPA:
add-apt-repository
命令會新增 Ansible 的 PPA,這樣就可以從 PPA 安裝最新版本的 Ansible。 - 安裝 Ansible:最後,使用
apt install ansible
來安裝 Ansible。
建立基本清單檔案
Ansible 使用清單檔案來管理目標伺服器。以下是一個簡單的清單檔案範例:
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.example.com
內容解密:
- 定義群組:
[webservers]
和[dbservers]
分別定義了兩個群組,分別是網頁伺服器和資料函式庫伺服器。 - 新增主機:在每個群組中列出相應的主機名稱。
執行第一個Ad-Hoc命令
Ad-Hoc 命令是 Ansible 提供的一種簡單且靈活的方式來執行任務。以下是一個簡單的 Ad-Hoc 命令範例:
ansible webservers -m ping -i inventory.ini
內容解密:
- 指定目標群組:
webservers
是目標群組名稱。 - 指定模組:
-m ping
指定要使用的模組,這裡是ping
模組。 - 指定清單檔案:
-i inventory.ini
指定清單檔案。
使用Vagrant進行本地基礎設施開發
Vagrant 是一個流行的工具,能夠簡化本地虛擬機器的建立和管理。以下是如何使用 Vagrant 與 Ansible 進行本地開發。
設定Vagrant
首先,需要安裝 Vagrant 和 VirtualBox。以下是安裝 Vagrant 的步驟:
sudo apt update
sudo apt install vagrant virtualbox
內容解密:
- 更新系統套件列表:
sudo apt update
會更新系統中的套件列表。 - 安裝 Vagrant 和 VirtualBox:
vagrant virtualbox
是用來管理虛擬機器的軟體。
建立第一個Vagrantfile
Vagrantfile 是 Vagrant 的組態檔案,以下是一個簡單的 Vagrantfile 範例:
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/bionic64"
config.vm.network "private_network", type: "dhcp"
end
內容解密:
- 指定 Vagrant 組態版本:
Vagrant.configure("2")
指定使用 Vagrant 組態檔案版本2。 - 指定 Box 名稱:
config.vm.box = "ubuntu/bionic64"
指定要使用的虛擬機器映像(Box)。 - 設定網路組態:
config.vm.network "private_network", type: "dhcp"
組態虛擬機器使用 DHCP 取得 IP 地址。
使用Ansible與Vagrant
接下來,可以將 Ansible 與 Vagrant 整合在一起。以下是如何在 Vagrantfile 中組態 Ansible:
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/bionic64"
config.vm.network "private_network", type: "dhcp"
config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook.yml"
ansible.inventory_path = "inventory.ini"
end
end
內容解密:
- 指定 Provisioner:
config.vm.provision "ansible"
指定使用 Ansible 作為 Provisioner。 - 指定 Playbook 路徑:
ansible.playbook = "playbook.yml"
指定要執行的 Playbook 檔案。 - 指定清單檔案路徑:
ansible.inventory_path = "inventory.ini"
指定清單檔案路徑。
深入Ad-Hoc命令
Ad-Hoc 命令在日常維運中非常有用,能夠快速執行一些簡單的任務。以下是一些常見的 Ad-Hoc 命令範例。
執行多台主機並發任務
Ansible 支援並發執行任務,這樣可以大幅提升效率。例如:
ansible webservers -a "uptime" -f 5
內容解密:
- 指定目標群組:
webservers
是目標群組名稱。 - 指定命令:
-a "uptime"
指定要執行的命令。 - 指定並發數:
-f 5
指定並發數為5。
取得環境資訊
使用 Ad-Hoc 命令可以快速取得環境資訊。例如:
ansible dbservers -m setup -i inventory.ini
內容解密:
- 指定模組:
-m setup
指定要使用的模組。 - 指定清單檔案:
-i inventory.ini
指定清單檔案。
Ansible Playbook:自動化組態管理
Playbook 是 Ansible 中最強大的一部分,能夠描述複雜的組態和佈署流程。
執行Playbook
以下是如何執行一個 Playbook:
ansible-playbook playbook.yml -i inventory.ini
內容解密:
- 指定 Playbook 檔案:
playbook.yml
是要執行的 Playbook 檔案。 - 指定清單檔案:
-i inventory.ini
指定清單檔案。
Playbook例項:Rocky Linux Node.js伺服器
以下是一個 Rocky Linux Node.js 應用伺服器的 Playbook 檔案範例:
---
- name: Set up Node.js app server on Rocky Linux
hosts: webservers
become: yes
tasks:
- name: Add EPEL repository
yum:
name: epel-release
state: present
- name: Install Node.js and npm
yum:
name:
- nodejs
- npm
state: present
- name: Create project directory
file:
path: /var/www/myapp
state: directory
owner: root
group: root
- name: Copy application code to server
copy:
src: /path/to/local/app/
dest: /var/www/myapp/
- name: Install application dependencies
npm:
path: /var/www/myapp/
- name: Start the Node.js application using PM2
command: pm2 start /var/www/myapp/app.js --name myapp
- name: Ensure PM2 starts on boot
command: pm2 startup systemd && pm2 save && pm2 resurrect
內容解密:
- Play 頁首資訊:包括
name
,hosts
,become
,tasks
- 新增EPEL儲存函式庫:EPEL儲存函式庫包含了許多有用的額外軟體包。
- 安裝Node.js和npm:從EPEL儲存函式庫安裝Node.js和npm。
- 建立專案目錄:建立一個目錄來存放應用程式碼。
- 複製應用程式碼到伺服器:將本地應用程式碼複製到伺服器上。
- 安裝應用程式依賴項:使用npm安裝應用程式所需的依賴項。
- 啟動Node.js應用程式:使用PM2啟動Node.js應用程式。
- 確保PM2啟動時自動啟動:確保PM2在系統啟動時自動啟動並還原應用程式。
高階Playbook技巧
Handler、環境變數及條件判斷
Handler 是 Ansible 中用來處理通知事件的一種方式。例如,當某個檔案變更時,可以通知另一個任務去重啟服務。
- name: Restart Apache if configuration changed
service:
name: apache2
state: restarted
內容解密:
name
: handler 名稱. 2.service
: module 名稱. 3.name
: service 名稱. 4.state
: service 必須重啟.
範本化變數與條件判斷
變數和條件判斷可以使 Playbook 陳述式更靈活。例如:
- name: Install MySQL if not already installed
yum:
name: mysql-server
state: present
when: ansible_os_family == "RedHat"
內容解密:
1.when
: 新增條件陳述式, 安裝 MySQL 的前提條件是 作業系統為 RedHat
.
整合及分享角色與模組函式庫(Ansible Galaxy)
Ansible Galaxy 是一個社群驅動的角色儲存函式庫,提供了許多可重複使用的角色和模組。
安裝Galaxy角色
可以使用以下命令來安裝 Galaxy 中的一個角色:
ansible-galaxy install geerlingguy.mysql
內容解密:
1.geerlingguy.mysql
: 在 galaxy 上找到名為 geerlingguy.mysql 的角色.
建立自訂角色
如果找不到符合需求的角色,也可以建立自己的角色。以下是如何建立一個基本角色結構:
ansible-galaxy init my_custom_role
內容解密:
1.init
: 初始化新角色.
2.my_custom_role
: 建立名為 my_custom_role 的新角色.
涵蓋更多高階功能及最佳實踐(玄貓)
玄貓強烈建議在實際應用中融入更多高階功能及最佳實踐以提升維運效率及系統穩定性。例如: 1.分層目錄結構 :結合搜尋路徑預設值與自身實際需求設計最適合自己的分層目錄結構。 2.分享角色及模組 :玄貓提議將高可重複利用度之分享角色及模組上傳至Galaxy供團隊或社群共同利用。 3.保持最低依賴關係 :玄貓認為避免過度依賴某些特殊套件或特殊版本以提升可移植性及維護成本降低為宜。
玄貓深信整合以上高階技術以及遵循最佳實踐將有助於您進一步精進 DevOps 自動化能力並達到較高程度之基礎設施管理自動化水平