Mímisbrunnr知恵の泉

← クラウドインフラ 一覧

🎓 レベル:発展 | 重要度:B(推奨)

📎 前提:Terraformの基礎(HCL・state) | 関連:コンテナとは(名前空間・cgroups)デプロイ戦略(ローリング・ブルーグリーン・カナリア)

要点(BLUF)

概念 ── プロビジョニング vs 構成管理

両者は層が違います。Terraform は「箱(VM・NW・LB)を作る」のが得意で、箱の中の「OS設定・パッケージ・アプリ配置」は構成管理ツール(Ansible・Chef・Puppet 等)の領分です。

flowchart LR
    tf["Terraform:プロビジョニング(VM・NW・LBを作る)"] --> out["出力: IP・認証情報"]
    out --> ans["Ansible:構成管理(中にパッケージ・設定・アプリを入れる)"]
    ans --> ready["稼働可能なサーバ"]

標準的な連携は「Terraform が資源を作って IP 等を出力 → Ansible がその IP に対して構成を流す」。役割を混ぜず、適材適所で使います(要最新確認の各ツール仕様)。

仕組み ── Mutable と Immutable

Mutable(可変)運用Immutable(不変)運用
変更方法稼働中サーバにSSHして変更新イメージを焼いて入れ替え
状態サーバごとに差が出やすい全台が同一(ドリフトしない)
ロールバック手で巻き戻す(難しい)前のイメージに戻すだけ
apt upgrade を本番で直接ゴールデンイメージ+作り直し

可変運用は、サーバを長生きさせ手で直し続けるので、いつしか「誰も再現できない一点物(スノーフレーク)」になりドリフト(IaCとは・宣言的構成)が溜まります。不変運用は、変更のたびにまっさらなイメージを焼いて丸ごと置き換える。全台が同一で、戻すのも前のイメージに切り替えるだけ。

flowchart LR
    code["設定の変更(コード)"] --> bake["イメージを焼く(Ansible/Packer)"]
    bake --> img["ゴールデンイメージ v2"]
    img --> deploy["Terraform で新イメージのVM群を作成"]
    deploy --> swap["LBを新群へ切替(旧群は破棄)"]

動く例 ── Ansible playbook の最小形

Ansible は冪等な構成を YAML(playbook)で宣言します。SSH(パッケージとユーザー・SSH)でターゲットに接続し、状態を収束させます。

# playbook.yml ── nginx を入れて起動する(冪等)
- hosts: web
  become: true
  tasks:
    - name: nginx を導入
      ansible.builtin.apt:
        name: nginx
        state: present          # あれば何もしない(冪等)
    - name: nginx を起動・自動起動
      ansible.builtin.service:
        name: nginx
        state: started
        enabled: true
ansible-playbook -i inventory.ini playbook.yml
# 2回目以降は「changed=0」=すでに望ましい状態(冪等性)

ゴールデンイメージ運用では、この playbook を起動中サーバでなくイメージビルド時に流し、焼けたイメージを Terraform で並べます。

なぜ Immutable なのか

⚠️ よくある誤解・落とし穴

対応ラボ

cloud-infra-study/labs/05-04_playbook.yml05-04_inventory.ini(nginx を入れる最小 Ansible playbook。--check で冪等性のドライランを観察。実行には Ansible とターゲットhost)。

関連

第5章 IaC 目次