LAC WATCH

セキュリティとITの最新情報

RSS

サービス・製品 | 

Infrastructure as Codeを実現するTerraformとAnsible~それぞれの得意領域と使い分け~

さらに詳しく知るにはこちら

HashiCorp Terraform Enterprise

ラックは2019年8月にHashiCorp社との協業を開始しました。パブリッククラウドにおけるインフラ構築、運用管理自動化を目的とした同社製品の提案、販売に注力する中で、Infrastructure as Code(IaC)を実現するTerraformは多くのお問い合わせを頂いています。導入実績も増えてきました。

さらに詳しく知るにはこちら

HashiCorp Terraform Enterprise

お客様にTerraformをご提案する際、必ずと言っていいほど聞かれるのがTerraformとAnsibleの違いについてです。似ているように見えるツールなので、何が違うのか気になるところですよね。

「当社の環境にはTerraformとAnsible、どちらを採用すれば良いだろうか」
「既にAnsibleは導入しているので、Terraformは不要だろうか」

ラックではいつも、このようにお答えしています。

TerraformとAnsibleでは得意な領域が違います。
両製品は競合ではなく、組み合わせて使用することで効果が大きくなります!

今回はTerraformとAnsibleについて、両製品の違い、得意とする領域についてご紹介します。導入を検討する際のご参考になれば幸いです。

改めてTerraform、Ansibleとは

Terraform

AWSやAzure、GCPなどさまざまなクラウドインフラのプロビジョニング情報を特定のインフラベンダに依存しない形式でコードとして記述し適用できる、いわゆるIaCを実現する、HashiCorp社によって開発されたソフトウェアです。

Ansible

サーバ構築時に、予め準備した設定ファイルに従って自動でソフトウェアインストール、設定を実行する、RedHat社によって開発された構成管理ツールです。 Ansibleでは各クラウドプロバイダーのモジュールを提供しており、ミドルウェアと同様にクラウドの構成管理も行うことができます。

こう書くと両製品は、コードや設定ファイルの記述に基づき構成管理を行うという点でほぼ同じのように見えます。実際IaCを実現するツールとしては両製品ともデファクトスタンダードとなっています。

ですが、両製品は得意とする領域が異なります。両製品の違いについて概略を以下の表にまとめましたので、ご覧ください。

項目 Terraform Ansible
開発元 HashiCorp RedHat
クラウドプロバイダ対応数 300以上 41※1
インフラ層の構成管理 優れている 対応可能
OS・ミドルウェア層の構成管理 対応可能 優れている
エージェントの要否 不要 不要※2
GUI
オープンソース版
メーカーサポート付きの商用版
SaaS提供
項目 Terraform Ansible
開発元 HashiCorp RedHat
クラウドプロバイダ対応数 300以上 41※1
インフラ層の
構成管理
優れている 対応可能
OS・ミドルウェア層の構成管理 対応可能 優れている
エージェントの
要否
不要 不要※2
GUI
オープンソース版
メーカーサポート付きの商用版
SaaS提供

※1 以下資料を参照(2020年12月4日現在)
Cloud modules -- Ansible Documentation

※2 OS・ミドルウェア層の構成管理にはPythonの実行環境が必要

特に大きな違いになるのが、赤い線で囲っている「インフラ層の構成管理」と「OS・ミドルウェア層の構成管理」です。これらの機能が、両製品を組み合わせて使い分けるポイントです。具体的にどのような点が異なるのか説明していきます。

IaCモデルの違い

IaCツールとして、Terraformは宣言モデル、Ansibleは命令実行モデルを採用しています。宣言モデルはインフラのあるべき状態をコードで表現します。対して、命令実行モデルはリソースを作成する手順をコードで表現します。では、実際にクラウドをIaCで管理する場合に、宣言モデルと命令実行モデルでどのような違いがでてくるのでしょうか?

例えば、AWSにEC2インスタンスを5台作成する場合を考えてみましょう。Ansibleの命令実行モデルでは下記命令を複数回実行してしまうと、5台("count"の数)×命令実行回数分のインスタンスを立ち上げてしまいます。※3

一方でTerraformではインフラの構成を宣言的に定義しており、下記コードを複数回実行したとしても、宣言したインスタンス数("count"の数)である5台のみを立ち上げます。

※3 実際コードを書く場合には、"exact_count"オプションを記述し、リソースのタグを指定することで、決めた数以上のインスタンの作成を防止します。

すなわちTerraformではコードと環境の一致について特別な配慮を行う必要がありません。
この点がインフラ層の構成管理においてはTerraformを使うべき理由となります。

Ansibleの場合

AWSにEC2インスタンスを5台作成する場合のAnsibleでの手順例。複数回実行してしまうと、

Terraformの場合

AWSにEC2インスタンスを5台作成する場合のTerraformでの手順例。複数回実行したとしても、宣言したインスタンス数である5台のみを立ち上げる。

リソースの依存関係

Ansibleはリソースの作成順序をユーザが定義します。その順序を決める際にはリソースの依存関係を考慮する必要があります。例えばAWSにVPC及びサブネットを作成する場合は、サブネットより先にVPCを作成する必要があります。Ansibleでは、設定ファイルに記述した順序でリソースを作成するため、VPCより先にサブネットの記述をしてしまうと、まだ存在しないVPCリソースを参照しようとしてエラーになります。

一方Terraformは、リソースの依存関係を自動で解決してくれるので、作業順序をコードで定義する必要がありません。これによりマルチクラウドにまたがる数十のリソースを記述する場合であっても、開発者は構成定義のみに集中することができます。この点もインフラ層の構成管理においてはTerraformを使うべき理由となります。

Ansibleの場合

AnsibleでAWSにVPC及びサブネットを作成する場合の手順例。サブネットより先にVPCを作成する必要がある。

Terraformの場合

TerraformでAWSにVPC及びサブネットを作成する場合の手順例。リソースの依存関係を自動で解決してくれるので、作業順序をコードで定義する必要がない。

ミドルウェアの構成管理

Terraformでミドルウェア層の構築を行う場合はシェルで定義するのに対して、Ansibleには豊富なミドルウェアモジュールが用意されています。そのため、複雑なミドルウェア層の構成管理はAnsibleで行うことをお勧めしています。

Ansibleの場合

Ansibleでミドルウェア層の構築を行う場合の手順例

Terraformの場合

Terraformでミドルウェア層の構築を行う場合の手順例

さいごに

TerraformとAnsibleにはそれぞれ得意なプロビジョニングレイヤがあり、対象とするリソースのライフサイクル(作成・更新の頻度など)も異なります。そこで例えばGithub Actions等のCIツールを利用することで、Terraformがインフラ層を構築した後に、AnsibleでOS・ミドルウェア層を構築するといった自動化も可能です。このように双方を効果的に使い分けることでIaCの効果を最大化することが出来ます。是非みなさんも試してみてください。

より詳しく知るにはこちら

より詳しく知るにはこちら

Terraformは、インフラ構築においてコードによる設定変更作業や履歴管理ができ、さらにマルチクラウドやハイブリッドクラウドの作業の自動化も管理画面から容易に行うことができます。

この記事は役に立ちましたか?

はい いいえ