iT邦幫忙

2025 iThome 鐵人賽

DAY 4
0
DevOps

新創視角下的 DevOps × AI 探索系列 第 4

Day 4:基礎設施即程式碼 IaC - Terraform / Ansible

  • 分享至 

  • xImage
  •  

前面三天算是鋪陳背景,今天 Day 4 終於進入到技術與工具主題了!

Ansible 和 Terraform 一直是我聽過卻沒有實際動手使用的工具,這次總算有機會深入研究。它們的核心概念都是透過「狀態(State)」來映射並管理機器的狀態,這樣的做法帶來不少好處:

  1. 節省人工操作的時間
  2. 減少人為操作失誤
  3. 讓 AI 更容易理解我們的架構
  4. 最後,當然是讓 AI 直接幫我們生成所需的架構啦😎

為什麼需要這些工具?
當我們需要維護數十台機器上的狀態、使用者、安裝的軟體等等,很容易就會出現繁瑣且容易出錯的情況。

Ansible

Ansible 的好處是:

  • 只要機器上有安裝 Python 並能透過 SSH 連線
  • 中控機器安裝並配置好 Ansible
    就能依照模板為多台機器執行定義好的任務,也能透過「分群」做更細緻的管理。

安裝方式

在大部分 Linux 發行版上,可以直接透過套件管理器安裝:

sudo apt update && sudo apt install -y ansible

或是使用 pip 安裝最新版:

pip install ansible

hosts.ini 範例

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 指定連線方式。

YAML 資源定義

在 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 內建模組,能幫我們做一些常見的任務

  • user:建立或刪除使用者
  • apt:安裝套件
  • service:控制服務啟動、停止

當然我們也能在 Ansible 配置中,使用自定義的模組。

當設定 state: present ,Ansible 會檢查目標機器是否已經有這個資源,沒有的話就建立;已經存在的話就什麼都不做。
其他常見的 state:

  • absent → 確保資源不存在(會移除掉)
  • started → 確保服務啟動中
  • stopped → 確保服務已停止

執行:

ansible-playbook -i hosts.ini playbook.yml

這樣就能一次在 web 群組的伺服器上完成設定。

Terraform

Terraform 則是針對雲端資源的管理。透過配置檔(HCL 語法),我們可以定義雲端環境中的機器資源。如果需要在不同環境中維護相似的機器配置,再配合 Git 進行版本控制,就能清楚掌握整個架構的歷史演進。

安裝方式

官方提供可執行檔,或使用套件管理器安裝:

sudo apt update && sudo apt install -y terraform

或 macOS 使用 Homebrew:

brew tap hashicorp/tap
brew install hashicorp/tap/terraform

Terraform 的資源定義

Terraform 使用 HCL(HashiCorp Configuration Language) 語法,概念上和 Ansible 的 Playbook 類似:

  • 透過 resource 區塊定義基礎設施資源,例如 EC2、S3 bucket、本地檔案
  • provider 定義要使用的環境(AWS、GCP、Azure、本地端等等)
  • Terraform 執行時會比對「目前狀態」與「定義的狀態」,只修改必要的部分

換句話說,它的角色就像是「雲端資源的狀態管理器」。

範例:建立本地專案結構

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.mdproject/config.ini,自動產生專案結構。

更複雜的情境

在實務中,我們可能會:

  • 在 AWS 建立 VPC 與子網路
    • 建立多台 EC2(Web、App、DB)並分配 Security Group
    • 配置 Auto Scaling 與 Load Balancer
    • 同時建立一個 S3 bucket 來放靜態檔案

透過 Terraform,我們可以將這些設定版本化,快速複製到不同環境,並且能隨時回溯基礎設施的歷史狀態。

結論

由於公司未來可能的成員增加,我們開始嘗試用 Ansible 來處理內部機器的用戶權限控管,確實省事不少。過去可能需要花上好幾天研究文件、手動嘗試,現在在 AI 的輔助下,往往只要一個下午就能完成一個可運行的配置,真的是很方便!但 Terraform 目前的幫助還沒那麼大,所以就沒那麼深入嘗試啦~


上一篇
Day 3:DevOps 的基石 - CI/CD
下一篇
Day5:理解 Kubernetes 的運行與核心資源
系列文
新創視角下的 DevOps × AI 探索11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言