はじめに
「IaCツールって色々あるけど、何が違うの?」
「TerraformとAnsible、どっちを使えばいいの?」
こんな悩み、ありませんか?
こんにちは、ハンズオンラボ運営メンバーのわたるです。インフラエンジニア10年目で、監視オペレーターから始まり、運用・保守、そして現在は設計・構築まで幅広く経験してきました。
正直に言うと、私も最初は「IaCツールが多すぎて何を選べばいいか分からない...」と悩んでいた一人でした。Terraform、Ansible、Chef、Puppet...調べれば調べるほど混乱していく状態だったんです。
でも、実はこの2つ、役割が全く違うんです。
この記事では、IT業界3年未満のエンジニアの方に向けて、TerraformとAnsibleの違いを「何が作れるのか」という視点から、3分で理解できるようにお伝えします。
TerraformとAnsibleの役割の違い
結論:「家を建てる」vs「家具を配置する」
まず結論から言うと、この2つの違いを一言で表すなら:
- Terraform = 家を建てる(インフラ構築)
- Ansible = 家具を配置する(設定管理)
もう少し技術的に言うと:
- Terraform = クラウドリソース(サーバー、ネットワーク、ストレージ)を作る
- Ansible = そのサーバーの中身(OS設定、ミドルウェア、アプリ)を設定する
なぜ混同しやすいのか
両方とも「Infrastructure as Code(IaC)」というカテゴリーに分類されるため、初心者の方は「同じようなもの」と思ってしまいがちです。
実際、私も最初は「どっちもインフラを自動化するツールでしょ?」と考えていました。でも、実務で両方を使ってみて分かったのは、レイヤー(層)が違うということです。
| 比較項目 | Terraform | Ansible |
|---|---|---|
| 得意領域 | インフラ層(クラウドリソース) | OS・ミドルウェア層 |
| 管理方式 | 宣言型(State管理) | 手続き型(手順実行) |
| 主な対象 | AWS/Azure/GCP等のクラウドリソース | サーバー内の設定・パッケージ |
| ファイル形式 | .tf (HCL言語) | .yml (YAML形式) |
| 実行イメージ | 「この状態にしてください」 | 「この手順で実行してください」 |
具体的なエピソード
私がこの違いを本当に理解したのは、あるプロジェクトでの出来事がきっかけでした。
先輩から「AWSにWebサーバーを構築して」と言われた時、私は最初Ansibleだけで全部やろうとしたんです。でも、EC2インスタンスを作るところで詰まりました。
Ansibleでもクラウドリソースを作ることは技術的には可能なのですが、依存関係の管理や状態の把握が非常に難しかったんです。「あれ、このネットワーク設定、前に作ったっけ?」「セキュリティグループの設定、どこに書いたっけ?」と混乱の連続...。
一方、Terraformを使うと、現在のインフラの状態がState(状態ファイル)で管理されているため、「今どういう構成になっているか」が一目瞭然でした。
逆に、サーバー内にApacheをインストールしたり、設定ファイルを配置したりする作業は、Ansibleの豊富なモジュールを使うことで簡単に自動化できました。
Terraformの基本:インフラを「宣言」する
Terraformとは?
Terraformは、HashiCorp社が開発したオープンソースのインフラ構築ツールです。
特徴:
- 宣言型: 「最終的にこうなっていてほしい」という状態を記述
- マルチクラウド対応: AWS、Azure、GCP、さらにはDatadogなども管理可能
- State管理: 現在の状態と差分を自動検出
よく使う基本コマンド
# 初期化(最初に1回実行)
terraform init
# 実行計画の確認(ドライラン)
terraform plan
# 実際に適用
terraform apply
# リソースの削除
terraform destroy
# 状態の確認
terraform show
# リソースのインポート
terraform import <リソースタイプ>.<名前> <ID>
主要コマンドのオプション一覧
terraform init オプション
| オプション | 効果 |
|---|---|
-upgrade |
プロバイダーを最新バージョンに更新 |
-backend-config=PATH |
バックエンド設定を指定 |
-reconfigure |
バックエンドを再設定(既存の設定を無視) |
-migrate-state |
既存のStateを新しいバックエンドに移行 |
terraform plan オプション
| オプション | 効果 |
|---|---|
-out=FILE |
実行計画をファイルに保存 |
-var 'key=value' |
変数を指定 |
-var-file=FILE |
変数ファイルを指定 |
-target=RESOURCE |
特定のリソースのみ計画 |
-refresh=false |
State更新をスキップ |
terraform apply オプション
| オプション | 効果 |
|---|---|
-auto-approve |
確認プロンプトをスキップ(自動承認) |
-var 'key=value' |
変数を指定 |
-target=RESOURCE |
特定のリソースのみ適用 |
-parallelism=n |
並列実行数を指定(デフォルト10) |
FILE |
保存済みの実行計画を適用 |
terraform destroy オプション
| オプション | 効果 |
|---|---|
-auto-approve |
確認プロンプトをスキップ |
-target=RESOURCE |
特定のリソースのみ削除 |
-var 'key=value' |
変数を指定 |
実行イメージ
# EC2インスタンスを定義
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "WebServer"
}
}
このコードを書いて terraform apply すると、Terraformが:
- 現在の状態を確認
- 差分を検出
- 必要なリソースを作成
という流れで自動的にインフラを構築してくれます。
Terraformが得意なこと
✅ クラウドリソースの作成・管理
- EC2、RDS、S3などのAWSリソース
- VPC、サブネット、ルートテーブルなどのネットワーク構成
- IAMロール、セキュリティグループなどのセキュリティ設定
✅ 状態管理
- 現在のインフラ構成をStateファイルで管理
- 変更差分を自動検出
- チームでの共同作業に適している
✅ マルチクラウド対応
- 1つのツールでAWS/Azure/GCPを管理
- クラウドを超えた統一的な記述が可能
Ansibleの基本:設定を「実行」する
Ansibleとは?
Ansibleは、Red Hat社が開発したオープンソースの構成管理ツールです。
特徴:
- 手続き型: 「この手順で実行してください」という処理を記述
- エージェントレス: 対象サーバーにソフトウェアのインストール不要(SSH接続のみ)
- 豊富なモジュール: パッケージ管理、ファイル操作、サービス管理など
よく使う基本コマンド
# アドホックコマンド(単発実行)
ansible all -m ping
# Playbookの実行
ansible-playbook site.yml
# 構文チェック
ansible-playbook site.yml --syntax-check
# ドライラン(変更を実際には適用しない)
ansible-playbook site.yml --check
# タスク一覧の表示
ansible-playbook site.yml --list-tasks
主要コマンドのオプション一覧
ansible アドホックコマンドオプション
| オプション | 効果 |
|---|---|
-i INVENTORY |
インベントリファイルを指定 |
-m MODULE |
実行するモジュールを指定 |
-a ARGUMENTS |
モジュールに渡す引数 |
-u USER |
接続ユーザー名を指定 |
-b または --become
|
特権昇格(sudoなど)を有効化 |
--become-user=USER |
昇格先のユーザーを指定 |
-k または --ask-pass
|
SSH パスワードを入力 |
-K または --ask-become-pass
|
sudo パスワードを入力 |
-f NUM |
並列実行数を指定(デフォルト5) |
--list-hosts |
対象ホストを表示 |
ansible-playbook コマンドオプション
| オプション | 効果 |
|---|---|
-i INVENTORY |
インベントリファイルを指定 |
--syntax-check |
構文チェックのみ実行 |
--check |
ドライラン(実際には変更しない) |
--diff |
変更内容の差分を表示 |
-v, -vv, -vvv
|
詳細度を上げる(デバッグ用) |
--list-tasks |
タスク一覧を表示 |
--list-tags |
タグ一覧を表示 |
--tags=TAGS |
特定のタグのみ実行 |
--skip-tags=TAGS |
特定のタグをスキップ |
--start-at-task="タスク名" |
指定したタスクから開始 |
-l SUBSET または --limit=SUBSET
|
対象ホストを限定 |
-e KEY=VALUE または --extra-vars
|
変数を上書き |
-b または --become
|
特権昇格を有効化 |
-k または --ask-pass
|
SSH パスワードを入力 |
-K または --ask-become-pass
|
sudo パスワードを入力 |
--step |
各タスクで実行確認を求める |
--forks=NUM |
並列実行数を指定 |
ansible-vault コマンドオプション
| オプション | 効果 |
|---|---|
create |
新しい暗号化ファイルを作成 |
encrypt |
既存ファイルを暗号化 |
decrypt |
ファイルを復号化 |
edit |
暗号化ファイルを編集 |
view |
暗号化ファイルを表示 |
rekey |
暗号化パスワードを変更 |
実行イメージ
# Apacheをインストールして起動
- name: Install and start Apache
hosts: webservers
become: yes
tasks:
- name: Install Apache
yum:
name: httpd
state: present
- name: Start Apache
service:
name: httpd
state: started
enabled: yes
このPlaybookを実行すると、Ansibleが:
- 対象サーバーにSSH接続
- タスクを順番に実行
- 結果をレポート
という流れで自動的に設定を適用してくれます。
Ansibleが得意なこと
✅ OS・ミドルウェアの設定
- パッケージのインストール(yum、apt、pip等)
- 設定ファイルの配置・編集
- サービスの起動・停止・再起動
✅ 既存環境への適用
- エージェント不要(SSH接続のみ)
- 既存サーバーの設定変更が容易
- 手順書のコード化に最適
✅ 可読性の高い記述
- YAML形式で直感的
- モジュールが豊富で学習コストが低い
- 初心者でも理解しやすい
実践的な使い分け:組み合わせて使うのが正解
実際のプロジェクトでの使い方
実務では、TerraformとAnsibleを組み合わせて使うのが一般的です。
よくあるワークフロー:
1. Terraformでインフラを構築
↓ (EC2、VPC、RDS等を作成)
2. Ansibleでサーバーを設定
↓ (Apache、MySQL等をインストール・設定)
3. アプリケーションをデプロイ
具体的な使い分け例
パターン1: Webシステムの構築
Terraformで作る:
- VPC、サブネット、インターネットゲートウェイ
- EC2インスタンス(Webサーバー用、APサーバー用)
- RDS(データベース)
- ロードバランサー(ALB)
- セキュリティグループ
Ansibleで設定:
- EC2インスタンスにNginx/Apacheをインストール
- アプリケーションサーバー(Tomcat、Node.js等)のセットアップ
- ミドルウェアの設定ファイルを配置
- ログローテーションの設定
- 監視エージェントのインストール
パターン2: 既存環境のコード化
既にサーバーが存在する場合:
- Terraformで
terraform importを使って既存リソースを取り込む - Ansibleで現在の設定を再現するPlaybookを作成
- 以降の変更はコードで管理
私が失敗から学んだこと
最初は「Terraformだけで全部やろう」と思っていた時期がありました。でも、サーバー内の細かい設定(例えば、Apacheのconf編集や証明書の配置)をTerraformで書くと、すごく読みにくくなってしまったんです。
逆に「Ansibleだけで」と思ったときは、VPCやサブネットの依存関係を手動で管理する羽目になり、「あれ、このサブネット、どのVPCに属してたっけ?」と混乱...。
結局、それぞれの得意分野に任せるのが最適解だと分かりました。
| シーン | 使うツール | 理由 |
|---|---|---|
| EC2を10台作る | Terraform | リソース管理が得意 |
| 全サーバーに監視エージェントを入れる | Ansible | 既存サーバーへの適用が楽 |
| ネットワーク構成を変更 | Terraform | State管理で差分が明確 |
| 設定ファイルを一括更新 | Ansible | 手順の自動化が得意 |
| 環境を丸ごと削除 | Terraform |
destroy一発で全削除 |
どちらから学び始めるべき?
初心者にはAnsibleがおすすめ
もしあなたが「どちらから学ぼうかな?」と迷っているなら、Ansibleから始めることをおすすめします。
理由:
- YAML形式が読みやすい - 英語の文章のように書ける
- すぐに効果が見える - 手元のサーバーですぐ試せる
- 既存の手順書をコード化できる - 今の業務にすぐ活かせる
- エージェント不要 - 環境構築がシンプル
Ansibleで「自動化」の感覚を掴んでから、Terraformでインフラ層を学ぶとスムーズです。
学習ロードマップの例
【ステップ1】Ansible基礎(1-2週間)
- 基本コマンドを覚える
- 簡単なPlaybookを書いてみる
- 既存の手順書を1つコード化してみる
【ステップ2】Terraform基礎(2-3週間)
- 基本コマンドを覚える
- 簡単なEC2を1台作ってみる
- VPCやセキュリティグループを理解する
【ステップ3】組み合わせて使う(1-2週間)
- Terraformでインフラ→Ansibleで設定の流れを体験
- 小規模なWebシステムを構築してみる
【ステップ4】実践レベル(継続的に)
- チーム開発での運用を学ぶ
- CI/CDパイプラインとの連携
- ベストプラクティスを学ぶ
まとめ
3行でまとめると
- Terraform = インフラ構築(家を建てる)、Ansible = 設定管理(家具を配置する)
- 実務では両方を組み合わせて使うのが一般的
- 初心者はAnsibleから学ぶとスムーズに理解できる
最後に
「IaCツールが多すぎて何を選べばいいか分からない」という悩み、本当によく分かります。
でも、この記事を読んで「TerraformとAnsibleは役割が違うんだ」「組み合わせて使うんだ」ということが理解できたら、もう大丈夫です。
あとは実際に手を動かしてみるだけ。最初は失敗して当然です。私も何度も「あれ、これどうやるんだっけ?」と詰まりました。
大事なのは、一人で悩まず、一緒に学べる環境を作ることです。
一緒に学びませんか?
私たちハンズオンラボでは、「IaCツールを実際に触ってみたい」「Terraform/Ansibleの使い分けを体験したい」という方のために、実践型ハンズオンを定期開催しています。
✅ 完全ハンズオン形式で実機を触れる - 座学だけじゃなく、実際に動かせる
✅ 現役エンジニアが伴走 - 詰まったらすぐに質問できる
✅ 初心者大歓迎・質問し放題 - 「こんなこと聞いていいのかな?」もOK
✅ 少人数制でしっかりサポート - 一人ひとりに目が届く環境
「一人で勉強していると挫折しそう...」
「実際の業務でどう使うのか知りたい...」
「同じレベルの仲間と一緒に学びたい...」
そんな方は、ぜひ一度遊びに来てください!
📍 connpassページ: https://zeki-chan-lab.connpass.com/
あなたの「できた!」を一緒に実現しましょう🚀