Terraform vs. Ansible:你實際上需要哪一個?
Terraform 和 Ansible 的實用比較,每個工具實際擅長的地方,以及如何在真實 IaC 管線中結合它們。
剛接觸基礎設施即程式碼的人通常用以下兩種方式提問:「我應該先學哪個工具」或「為什麼團隊兩個都用」。簡短的答案是 Terraform 和 Ansible 解決不同的問題,大多數生產環境會一起使用這兩個工具,而不是只選其中一個。
Terraform 實際上是做什麼的
Terraform 是一個佈建工具。它宣告應該存在的基礎設施:VPC、三個 EC2 實例、RDS 資料庫、具有特定原則的 S3 值區。你用 HCL 描述最終狀態,執行 terraform plan 看會改變什麼,然後執行 terraform apply 來實現它。Terraform 保留狀態檔案(本地或在像 S3 值區搭配 DynamoDB 鎖定的後端中),將你的配置對應到雲端提供商的真實資源 ID。
其優勢在於跨提供商的依賴解析。如果你告訴 Terraform 建立安全群組,然後將其附加到 EC2 實例,它會自動判斷順序。它也透過相同的工作流程在 AWS、Azure、GCP、Cloudflare、Datadog 和數十個其他提供商間運作,這在你的基礎設施跨越多個廠商時很重要。
Terraform 在機器存在後發生的任何事都不擅長。它不安裝套件、編輯配置檔案,或以任何有意義的持續方式重啟服務。像 remote-exec 這樣的佈建工具存在,但 HashiCorp 本身建議除了啟動之外的任何事都避免使用它們。
Ansible 實際上是做什麼的
Ansible 是組態管理工具。它透過 SSH(或 WinRM for Windows)連線並對已存在的機器執行工作:安裝 nginx、範本化配置檔案、建立使用者、重啟服務、確保 cron 工作存在。Playbook 是 YAML,模組在設計上是冪等的,所以執行相同的 playbook 兩次,如果系統已符合所需狀態,第二次應該不會改變任何東西。
Ansible 不需要在目標主機上安裝代理,只需要 Python 和 SSH 存取,這使它容易連接到現有基礎設施。它也擅長不完全是「佈建」的編排工作——跨群隊的滾動重啟、藍綠部署步驟、在一台主機上執行資料庫遷移,然後更新負載平衡器。
它們重疊的地方和人們容易困惑的地方
技術上,兩個工具都能做一點彼此的工作。Ansible 有雲端模組(amazon.aws.ec2_instance、azure.azcollection.azure_rm_virtualmachine)可以啟動基礎設施。Terraform 有佈建工具可以在新實例上執行 shell 命令。但使用 Ansible 進行佈建意味著放棄 Terraform 的狀態追蹤和計畫/差異工作流程,而使用 Terraform 佈建工具進行組態則意味著放棄冪等的、可重複的組態管理。
大多數團隊採用的實用劃分:
- Terraform 建立基礎設施:網路、計算實例、負載平衡器、受管資料庫、IAM 角色。
- Ansible 配置其上的內容:軟體安裝、使用者、配置檔案、服務狀態、應用程式部署步驟。
交接的具體例子
假設你在 AWS 上設置三個負載平衡器後的網路伺服器。
resource "aws_instance" "web" {
count = 3
ami = data.aws_ami.ubuntu.id
instance_type = "t3.medium"
tags = { Name = "web-${count.index}" }
}
output "web_ips" {
value = aws_instance.web[*].public_ip
}
Terraform 建立實例並輸出其 IP。你可以將該輸出饋入動態 Ansible 清冊(amazon.aws.aws_ec2 清冊外掛直接讀取 EC2 標籤,不需要手動複製貼上),然後執行:
ansible-playbook -i aws_ec2.yml site.yml
其中 site.yml 安裝 nginx、放入應用程式配置,並啟動服務。Terraform 永遠不會動到 nginx。Ansible 永遠不會動到 VPC。每個工具都保持在自己的範圍內,各有自己的狀態/冪等性模型,不會與另一個工具的衝突。
值得避免的常見錯誤
將 Terraform 狀態存儲在 git 是最常見的早期錯誤——狀態檔案可能以純文字形式包含密鑰,並導致合併衝突,破壞你的基礎設施模型。從一開始就使用遠端後端。
Ansible 的錯誤是編寫不實際冪等的 playbook——使用 shell 或 command 模組來做已有適當模組的事(ansible.builtin.apt、ansible.builtin.copy、ansible.builtin.systemd),這些模組已正確處理檢查然後執行的邏輯。
如果你決定先學什麼:如果你在做雲端佈建和多環境設置,就先學 Terraform;如果你在管理已有伺服器的組態漂移,就先學 Ansible。大多數 DevOps 角色期望在第一年內熟悉兩者。
關於狀態管理、動態清冊和圍繞這些工具建置完整 CI/CD 管線的更多資訊,請查看 Korra Studio 上相關的 DevOps 和 Cloud 段落。
本文由 AI 協助撰寫,經 Michal Pilch(CISSP)審核並發佈,Korra Studio。
這是 Korra Studio 知識庫中的一篇筆記——該平台將每個主題與一對一的師資配對。
免費開始arrow_forward