前面三天算是鋪陳背景,今天 Day 4 終於進入到技術與工具主題了!
Ansible 和 Terraform 一直是我聽過卻沒有實際動手使用的工具,這次總算有機會深入研究。它們的核心概念都是透過「狀態(State)」來映射並管理機器的狀態,這樣的做法帶來不少好處:
為什麼需要這些工具?
當我們需要維護數十台機器上的狀態、使用者、安裝的軟體等等,很容易就會出現繁瑣且容易出錯的情況。
Ansible 的好處是:
在大部分 Linux 發行版上,可以直接透過套件管理器安裝:
sudo apt update && sudo apt install -y ansible
或是使用 pip 安裝最新版:
pip install ansible
Ansible 需要一個 Inventory 檔案(通常命名為 hosts.ini),用來定義有哪些機器要被管理:
[web]
192.168.1.101
192.168.1.102
[db]
192.168.1.201
[all:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=~/.ssh/id_rsa
這裡我們定義了兩組群組:web
(兩台伺服器)、db
(一台伺服器),並在 all:vars
指定連線方式。
在 Ansible 中,Playbook 是以 YAML 格式定義的。裡面描述了 資源與任務(tasks)
Ansible 在執行時,會依照 Playbook 定義的任務,透過 SSH 逐步在指定機器上套用。
範例:建立使用者並安裝套件
- hosts: web
become: yes
tasks:
- name: 建立新使用者
user:
name: demo
state: present
shell: /bin/bash
- name: 安裝 nginx
apt:
name: nginx
state: present
update_cache: yes
- name: 啟動 nginx
service:
name: nginx
state: started
enabled: yes
config 中 user, apt, service 都是 Ansible 內建模組,能幫我們做一些常見的任務
當然我們也能在 Ansible 配置中,使用自定義的模組。
當設定 state: present
,Ansible 會檢查目標機器是否已經有這個資源,沒有的話就建立;已經存在的話就什麼都不做。
其他常見的 state:
執行:
ansible-playbook -i hosts.ini playbook.yml
這樣就能一次在 web 群組的伺服器上完成設定。
Terraform 則是針對雲端資源的管理。透過配置檔(HCL 語法),我們可以定義雲端環境中的機器資源。如果需要在不同環境中維護相似的機器配置,再配合 Git 進行版本控制,就能清楚掌握整個架構的歷史演進。
官方提供可執行檔,或使用套件管理器安裝:
sudo apt update && sudo apt install -y terraform
或 macOS 使用 Homebrew:
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
Terraform 使用 HCL(HashiCorp Configuration Language) 語法,概念上和 Ansible 的 Playbook 類似:
換句話說,它的角色就像是「雲端資源的狀態管理器」。
範例:建立本地專案結構
provider "local" {}
resource "local_file" "readme" {
content = "Hello Terraform!"
filename = "${path.module}/project/README.md"
}
resource "local_file" "config" {
content = <<EOT
[server]
host = localhost
port = 8080
EOT
filename = "${path.module}/project/config.ini"
}
執行:
terraform init
terraform apply
Terraform 會建立 project/README.md
與 project/config.ini
,自動產生專案結構。
更複雜的情境
在實務中,我們可能會:
透過 Terraform,我們可以將這些設定版本化,快速複製到不同環境,並且能隨時回溯基礎設施的歷史狀態。
由於公司未來可能的成員增加,我們開始嘗試用 Ansible 來處理內部機器的用戶權限控管,確實省事不少。過去可能需要花上好幾天研究文件、手動嘗試,現在在 AI 的輔助下,往往只要一個下午就能完成一個可運行的配置,真的是很方便!但 Terraform 目前的幫助還沒那麼大,所以就沒那麼深入嘗試啦~