Ansible vs Terraform 2026年完全比較: IaCとDevOps面接対策ガイド
AnsibleとTerraformの使い分けを徹底解説。宣言的と手続き的アプローチの違い、ステート管理、OpenTofuの動向、DevOps面接で頻出する質問と回答例を紹介します。

AnsibleとTerraformの比較はDevOps面接で最も頻出するトピックの一つですが、この質問の立て方自体に誤解が含まれています。両ツールは本質的に異なる課題を解決するものです。Ansible 2.20は構成管理とアプリケーションデプロイを担当し、Terraform 1.15はインフラストラクチャリソースのプロビジョニングを担います。それぞれが得意とする領域、重複する部分、そして相互に補完し合う方法を理解することが、シニアDevOpsエンジニアとしての実力を証明する鍵となります。
Terraformはインフラの状態を宣言的に管理します(VM、ネットワーク、データベース)。Ansibleはそのインフラ上で動作するものを手続き的に構成します(パッケージ、サービス、ファイル)。本番環境のほとんどでは両方が使用されています。
宣言的 vs 手続き的: 根本的な違い
Terraformは宣言的アプローチを採用しています。構成ファイルで望ましい最終状態を記述すると、Terraformがその状態に到達するために必要な変更を計算します。このアプローチは、一つの単位として作成、変更、または破棄する必要があるインフラに適しています。
# main.tf
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.medium"
tags = {
Name = "web-server"
Environment = "production"
}
}
resource "aws_security_group" "web" {
name = "web-sg"
description = "Allow HTTP and HTTPS"
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}terraform applyを実行すると、リソースが存在しない場合は両方を作成し、構成と一致するように更新します。変更なしで再度実行しても操作は発生しません。Terraformは構成をステートファイルと比較し、変更がないことを検出します。
Ansibleは手続き的アプローチを採用し、タスクを順番に実行します。Ansibleモジュールはしばしば冪等性を持つ(2回実行しても同じ結果になる)一方で、Playbook自体は最終状態ではなくアクションの順序を記述します。
# webserver.yml
- name: Configure web server
hosts: webservers
become: true
tasks:
- name: Install nginx
ansible.builtin.apt:
name: nginx
state: present
update_cache: true
- name: Copy nginx configuration
ansible.builtin.template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Restart nginx
- name: Ensure nginx is running
ansible.builtin.service:
name: nginx
state: started
enabled: true
handlers:
- name: Restart nginx
ansible.builtin.service:
name: nginx
state: restarted各タスクは順番に実行されます。notify/handlerパターンは宣言的な動作を提供し、handlerはトリガーされた回数に関係なく最後に1回だけ実行されます。
ステート管理: 面接での重要トピック
Terraformはステートファイルを維持し、構成を実際のリソースにマッピングします。このステートはリソースID、依存関係、メタデータを追跡します。ステートがなければ、Terraformは何が存在し何を変更すべきかを判断できません。
| 観点 | Terraform | Ansible |
|---|---|---|
| ステートストレージ | 必須(ローカルファイルまたはリモートバックエンド) | デフォルトでなし |
| ドリフト検出 | terraform planで内蔵 | 明示的なチェックが必要 |
| リソース追跡 | ステートを通じて自動 | インベントリベース |
| ロールバック | ステートから破棄して再作成 | ネイティブなロールバックなし |
Ansibleには同等のステートファイルがありません。ターゲットシステムに接続してタスクを実行し、現在のシステム状態とモジュールの冪等性に依存します。これによりAnsibleは始めやすいですが、時間経過に伴う変更の追跡が困難になります。
面接でよく聞かれる質問の一つは、ステートファイルのセキュリティについてです。Terraformステートには機密データが含まれる可能性があります:データベースパスワード、APIキー、リソース識別子など。本番デプロイではステートをリモート(S3、Azure Blob、Terraform Cloud)に暗号化とアクセス制御付きで保存します。
# backend.tf
terraform {
backend "s3" {
bucket = "company-terraform-state"
key = "prod/infrastructure.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-locks"
}
}DynamoDBテーブルはロックを提供し、2人のエンジニアが同時にステートを変更することを防ぎます。
各ツールの使い分け
Terraformはクラウドインフラのプロビジョニングに優れています:仮想マシン、マネージドデータベース、ロードバランサー、IAMロール、VPC。リソース間の依存関係を自動的に処理し、一貫したHCL構文を通じてすべての主要クラウドプロバイダーをサポートします。
Ansibleは既存システムの構成に優れています:パッケージのインストール、ユーザー管理、アプリケーションコードのデプロイ、マルチステップデプロイのオーケストレーション。SSH(Windowsの場合はWinRM)を介して接続し、ターゲットマシンにエージェントを必要としません。
重複領域が混乱を招きます。両方ともVM上にソフトウェアをインストールできます。Terraformはprovisionersを使用してリソース作成後にスクリプトを実行できます。Ansibleはamazon.aws.ec2_instanceのようなモジュールを通じてクラウドリソースを作成できます。しかし、各ツールをその強みの外で使用すると保守性の問題が発生します。
Terraform provisionerを構成管理に多用すると、脆弱なインフラになります。Provisionerは作成時にのみ実行され、その後のapplyでは実行されません。インフラにはTerraform、構成にはAnsibleを使用してください。
本番環境での統合ワークフロー
ほとんどの組織では両方のツールを組み合わせて使用します。Terraformがインフラをプロビジョニングし、接続詳細を出力します。Ansibleがその出力を消費してシステムを構成します。
# outputs.tf
output "web_server_ips" {
value = aws_instance.web[*].private_ip
description = "Private IPs of web servers"
}
output "db_endpoint" {
value = aws_rds_instance.main.endpoint
description = "RDS endpoint for application config"
}CI/CDパイプラインは最初にTerraformを実行し、出力を取得し、Ansibleインベントリを動的に生成してから、新しいインフラに対してPlaybookを実行します。
# ansible/inventory/aws_ec2.yml
plugin: amazon.aws.aws_ec2
regions:
- us-east-1
filters:
tag:Environment: production
instance-state-name: running
hostnames:
- private-ip-address
groups:
webservers: "'web' in tags.Role"
databases: "'db' in tags.Role"このダイナミックインベントリはAWSに直接クエリを発行し、タグに基づいてインスタンスをグループ化します。手動でのIP管理は不要です。
DevOpsの面接対策はできていますか?
インタラクティブなシミュレーター、flashcards、技術テストで練習しましょう。
OpenTofu: 情勢を変えたフォーク
HashiCorpは2023年8月にTerraformをBusiness Source License(BSL)の下で再ライセンスしました。コミュニティはTerraform 1.5をOpenTofuとしてフォークし、現在はLinux Foundation傘下でホストされています。
2026年8月現在、OpenTofu 1.11.6はほとんどのTerraformワークフローのドロップイン代替として機能し続けています。同じHCL構文、同じプロバイダーエコシステム、同じステートフォーマット。OpenTofuはTerraformのオープンソースバイナリにはない機能を追加しています:ステート暗号化、provider for_each、早期変数評価などです。
面接対策として、ライセンスの違いを理解しておく必要があります。BSLは社内使用を許可しますが、競合製品の構築を制限します。ベンダーロックインを懸念する組織や特定のコンプライアンス要件を持つ組織は、OpenTofuのMPL 2.0ライセンスを好む場合があります。2024年12月のIBMによるHashiCorp買収は、ベンダー関係の議論に新たな変数を加えました。
DevOps面接でよくある質問
Q: AnsibleでTerraformを置き換えられますか?
効果的には置き換えられません。Ansibleはクラウドリソースを作成できますが、ステート管理機能がありません。同じPlaybookを2回実行すると重複リソースが作成される可能性があります。Terraformのステートファイルは存在するものを追跡し、最小限の変更を計算します。Ansibleは得意な分野、つまり構成管理に使用してください。
Q: Terraformでシークレットをどう扱いますか?
シークレットをバージョン管理にコミットしないでください。環境変数、Vault統合、またはクラウドプロバイダーのシークレットマネージャーを使用します。ログに表示されないように変数をsensitiveとしてマークします:
# variables.tf
variable "db_password" {
type = string
sensitive = true
description = "Database password from Vault or environment"
}Q: Ansibleの冪等性とは何ですか?
冪等な操作は、1回実行しても複数回実行しても同じ結果を生成します。aptモジュールとstate: presentは、パッケージがない場合はインストールし、既にインストールされている場合は何もしません。冪等なPlaybookを書くことで、繰り返し実行時の意図しない変更を防ぎます。
Q: インフラコードをどうテストしますか?
Terraform:terraform validateは構文をチェックし、terraform planは変更をプレビューし、Terratestのようなツールで統合テストを実行します。Ansible:ansible-lintで問題を検出し、--checkモードでドライランを実行し、Moleculeでコンテナに対してロールをテストします。
Terraform面接対策をさらに深めるには、Terraform面接質問:Infrastructure as Code完全ガイドを参照してください。Terraform基礎とAnsible構成管理モジュールでハンズオン演習を行えます。
バージョン互換性とエコシステム
2026年8月現在の安定版:
| ツール | バージョン | リリース日 | 主な機能 |
|---|---|---|---|
| Ansible | 2.20.5 | 2026年4月 | コレクション管理の改善 |
| Terraform | 1.15.8 | 2026年7月 | Windows ARM64サポート、convert関数 |
| OpenTofu | 1.11.6 | 2026年4月 | ステート暗号化、provider for_each |
Ansibleのコレクションアーキテクチャは、コア機能とプロバイダー固有のモジュールを分離しています。amazon.awsコレクションはAnsibleコアとは独立して更新を受け取ります。これはCI/CDパイプラインでのバージョン固定に重要です。
Terraformのプロバイダーバージョン管理も同様の原則に従います。ロックファイル(terraform.lock.hcl)により、チームメンバーとCIシステム間で一貫したプロバイダーバージョンが保証されます。
# versions.tf
terraform {
required_version = ">= 1.15.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.60"
}
}
}選択の判断基準
問題は「AnsibleかTerraformか」ではありません。問題は「どのツールがどの責務を担当するか」です。
| ユースケース | 推奨ツール |
|---|---|
| VM、データベース、ネットワークのプロビジョニング | Terraform |
| OSの構成、パッケージのインストール | Ansible |
| Kubernetesリソースの管理 | TerraformまたはkubectlおよびHelm |
| アプリケーションコードのデプロイ | AnsibleまたはCI/CDネイティブ |
| IAMロールとポリシーの作成 | Terraform |
| サーバー上のユーザーアカウント管理 | Ansible |
| モニタリングインフラの構築 | Terraform(リソース作成)+ Ansible(エージェント構成) |
これらのツールが最新のデプロイワークフローにどのように適合するかの全体像については、CI/CDパイプライン面接質問を参照してください。
シニアエンジニアが知るべきAnsibleとTerraform
- Terraformはインフラの状態を宣言的に管理し、Ansibleはシステムを手続き的に構成します。両方を組み合わせることで保守性の高いインフラが実現します。
- ステートファイルのセキュリティは重要です。Terraformステートは暗号化とロックを有効にしてリモートに保存してください。
- OpenTofuはMPLライセンスのTerraform代替を提供し、追加機能も備えています。ほとんどのワークフローで移行は簡単です。
- 冪等性は自動ではありません。繰り返し実行で一貫した結果を生成するPlaybookを書いてください。
- ダイナミックインベントリにより手動ホスト管理が不要になります。現在のインフラについてクラウドプロバイダーに直接クエリを発行します。
- バージョン固定により予期せぬ事態を防ぎます。Terraformではプロバイダーバージョンをロックし、Ansibleではコレクションバージョンを固定します。
- インフラコードのテストには異なるアプローチが必要です:変更のプレビューには
terraform plan、Ansibleのドライランには--checkモード、両方に統合テストフレームワークを使用します。
今すぐ練習を始めましょう!
面接シミュレーターと技術テストで知識をテストしましょう。
DevOps のバグを見つけられますか
実際のコード、隠れたバグ、1日1回。アカウントなしで試せます。

執筆
Anthony Fillion-MailletSharpSkill 創業者
10 年以上フルスタック開発に携わっています。SharpSkill を運営し、ここで公開される内容に責任を負っています。
2026年8月22日 更新
共有
関連記事

2026年版 Kubernetesシークレット管理完全ガイド:External Secrets、Vault、面接対策
Kubernetesのシークレット管理について、External Secrets Operator、HashiCorp Vaultとの連携、本番環境でのベストプラクティス、および技術面接での頻出質問を解説します。

Docker Compose 2026: マルチコンテナアプリケーション、ネットワーキング、DevOps面接質問集
Docker Composeでマルチコンテナアプリケーションを構築する方法を解説。ネットワーク設定、ボリューム管理、本番環境デプロイメントの実践的なパターンとDevOps面接で頻出の質問と回答を収録。

Kubernetes Helm Charts 完全ガイド 2026:パッケージング、デプロイメント、面接対策
Helm 3を使用したKubernetesアプリケーションのパッケージングとデプロイメント手法を解説。チャート構造、テンプレート作成、依存関係管理、そして技術面接で頻出する質問と回答例を網羅的に紹介します。