APC Automation blog

ネットワーク自動化支援のAutomation Coordinatorを提供する、エーピーコミュニケーションズ ACTの自動化ブログ

AnsibleとTerraformの違い、使い分け

はじめに

こんにちは、iTOC事業部 ACTの西城です。
今回はAnsibleとTerraformにはどういった違いがあるのか、どう使い分けるかを紹介します。
それぞれの名前は分かるが具体的にどう違うのか知らない方や、業務の自動化を検討しているがどのツールを選べばよいか分からない方に読んでいただきたい内容です。
※技術的な内容より、端的にツール毎の特徴を知りたい方は末尾から先に読んでいただけると分かりやすいかもしれません。
 

AnsibleとTerraformについて

まずは本記事で扱うツールについて簡単に説明します。
各ツールについて詳細に知りたい方は、弊ブログにそれぞれを解説した記事があるのでそちらを参照してください。
Ansibleについて
-> Ansibleとはなにか [特徴 | 製品紹介 | 入門 | できること/できないこと] - APC Automation blog
Terraformについて
-> ITインフラ自動化推進: Terraformとは - APC Automation blog

Ansible

現在はRed Hat社が開発しているOSSの構成管理、自動化ツールです。 Pythonで開発されており、インフラの構成を記述したコードはYAML形式で記述します。

Terraform

HashiCorp社が開発したIaCツールです。
Go言語で開発されており、インフラの構成を記述したコードはHCL*形式で記述します。
※HCL(HashiCorp Configuration Language)はHashicorpが開発した言語です。
 
 
開発言語やコードの記述形式は異なりますが、両者ともインフラ構成をコードとして記述するIaC、自動化ツールです。また、AnsibleもTerraformも共に多機能なツールであるため、同様の機能が多くあります。
しかし、特徴や得意な領域が異なるため、自動化を行う対象や範囲によって使い分けることで、ツールを最大限に活用することができます。

Ansible、Terraformがどういったシーンで活用できるか

ここからはAnsibleとTerraformはそれぞれどういった特徴を持っていて、どういったシーンで活用できるのかを説明します。
 

Ansibleの特徴① 得意なこと

エージェントレスでありSSHログイン可能な機器は自動化対象であること

Ansibleは自動化対象の機器にSSHでログインし操作を行います。 自動化対象の機器で事前に行う設定はSSHサーバの設定だけなので、エージェントソフトといった特別なソフトがインストールできない機器または環境でも動作可能です。
※自動化対象の機器やサービスによってはSSHではなく、APIなどを使用して操作するものもあります。

豊富なモジュールにより様々なOS、機器に対応

LinuxWindowsといったOSや、Cisco, Juniper, F5, Fortinetなど様々なベンダの機器に対応するモジュールが存在します。豊富なモジュールにより、サーバOSの設定、ソフトウェアの設定やNW機器、セキュリティ機器の設定の自動化が行えます。

冪等性が確保しやすい

Ansibleはこれから設定しようとしているコンフィグが既に設定されているかどうかをモジュールが判断してくれるので、冪等性を確保しやすいです。 そのため、冪等性確保のために処理を追加する開発を減らすことができます。

冪等性の例:新規でファイルを作成するコードでは、ファイル作成前に該当のファイルが存在するかを確認して、存在しない場合は作成を行う、既に存在する場合はファイル作成の処理をスキップする。このような動作により同じコードを複数回実行しても結果は同じになる。
 

Terraformの特徴① 得意なこと

豊富なプロバイダーにより、多くのクラウドサービスや仮想化基盤に対応

クラウドサービス(AWS, Azure, Google Cloudなど)はもちろん、オンプレミスで動かしているハイパーバイザー(ESXiやHyper-Vなど)にも使用可能です。

様々なプラットフォームに対する統一された操作

上記のようにTerraformは様々なプラットフォームで使用可能です。そのため、複数種類のクラウドサービスや、クラウドサービスとオンプレミスを組み合わせた環境などで、環境ごとに異なるIaCツールを使用することなくTerraformで管理することが可能になります。

構築したインフラのリソース情報はファイルとして保持

Terraformは構築したリソースの情報を基に、現在のインフラ構成がどうなっているかをテキスト形式の「状態ファイル」で保持します。
Terraform実行時にはコードに記述された理想の状態と、「状態ファイル」に記述された現在の状態を比較し、どのリソースを作成、変更、削除するのかを決定します。必要な変更だけを加えるため、予期しない構成の変更を防ぐことができます。
 
 

Ansibleの特徴② 苦手なこと

自動化対象の機器やサービスに外部からコマンドを入力できる環境が必要

Ansibleは主にSSHを使用して機器に接続するので、対象機器がSSHサーバとして動作する必要があります。 (SSHに対応していない古いNW機器などの場合はTelnet接続も一応できます。)
そのため、SSHサーバおよびIPアドレスの設定は手動または別の方法で行う必要が出てきます。
また、SSH以外の接続方式を使用するモジュールも存在します。
Windowsを操作するモジュールの場合、SSHサーバではなくWinRMの設定を事前に行う必要があります。
APIを使用して接続するモジュールの場合、自動化対象のサービスでAPIから設定が行えるように事前準備を行う必要があります。

対応するモジュールがないと、Ansibleの真価が発揮できない

行いたい設定に対応するモジュールがなくても、CLIで入力するコマンドを使用して設定を行うことは可能ですが、Ansibleの特徴の1つである冪等性が確保できません(冪等性を確保する処理を追加する必要が出てきます)。
 

Terraformの特徴② 苦手なこと

自動化対象のプロバイダー(API)がないと何もできない

IssSや仮想化基盤へのアクセス方法はAPIを経由したものなので、そもそもシステムを操作できるAPIがなかったり、そのAPIを利用したプロバイダーが提供されていないとTerraformは何もできません。

コンフィグの自動化

Terraformでもシェルスクリプトを使用することでVMに対してコンフィグを投入することが可能ですが、Ansibleと比べると柔軟性や再利用性で劣ります。

構築済みの環境への導入

Terraformが正常に動作するには、状態ファイルと実際のインフラ構成が一致している必要があります。そのため、既に構築されている環境にTerraformを導入したい場合は、状態ファイルを実際の構成に合わせる形で修正する作業が必要になります。

管理体制の統一が求められる

理由は1つ上のものと同じになりますが、Terraformで構築した環境にTerraform以外の方法で変更を加えてしまうと、状態ファイルと実際の構成がズレてしまいTerraformの動作に支障が生じます。
そのため、Terraformで構築した環境はTerraform以外からは変更を加えない、といった統一された管理体制が必要になります。
   
 

Ansible、Terraform、特徴のまとめ

2つのツールについて簡単にまとめると
・AnsibleはOSレイヤ以上の自動化が得意で、機器の初期設定の自動化が苦手
・Terraformはクラウドサービスやハイパーバイザー上のリソースの自動化が得意、OSレイヤ以上の自動化が苦手
となります。
 
 

既にAnsibleが導入されている環境にTerraformを導入すると、どのようなメリットがあるのか

Ansibleは導入しているがTerraformは導入しておらず、クラウドサービスやハイパーバイザーの管理をAnsibleまたは手動で行っている環境にTerraformを導入することで、どういったメリットがあるかを説明します。

作成したインフラリソースの情報をTerraform側で管理してくれる

Terraformでは構築したインフラリソースを状態ファイルとして保持しますが、Ansibleには作成したインフラリソースの状態を保持する機能はありません。
構築されたインフラがどういった状態かをTerraformが把握することで下記のようなメリットがあります。

変更を適用する前に具体的な変更点を確認できる

Terraformでは状態ファイルとコードに記述された構成を比較し、具体的にどのリソースが作成、削除、変更されるのかを表示します。
具体的な変更点を確認してから、反映させることができます。

Ansibleにもドライラン機能(チェック機能)がありますが、モジュールによっては対応していなかったり、表示内容は変更点があるか否かしか表示されず、具体的に何が作成、削除、変更されるのかまでは分かりません。

環境の削除が容易になる

Terraformは状態ファイルにより現在のインフラ構成を把握するので、Terraformの削除用コマンドを実行するだけで作成した環境を削除することができます。

一方でAnsibleは構築したインフラ構成を把握していないため、環境を削除するためには削除用のコードを別途開発する必要があります。

コード内で依存関係を意識しなくても良い

Ansibleは手続き型のため、作成するリソースの依存関係を意識してコードを記述する必要があります。一方、Terraformは宣言型であり依存関係をツール側が解決してくれるため、依存関係を厳密に意識することなく開発することができます。
例:EC2とそのEC2が接続するVPCを同時に作成するコードで、EC2->VPCの順に記述しても、Terraformが依存関係を解決し実行時にはVPC->EC2の順で作成を行い、VPCにEC2が接続されます。
 
 

既にTerraformが導入されている環境にAnsibleを導入すると、どのようなメリットがあるのか

Terraformは導入しているがAnsibleは導入しておらず、VMのコンフィグをスクリプト等で投入している。または手動で行っている環境にAnsibleを導入することでどのようなメリットがあるかを説明します。

OSやソフトウェアの設定が容易に

TerraformでもスクリプトでOSやソフトウェアの設定をある程度行えますが、Ansibleで設定を行うことで下記のようなメリットがあります。

冪等性を確保しやすい

シェルスクリプトでは現在の設定やファイルの有無に関わらずコマンドが実行されるため、複数回スクリプトを実行した際にコマンドによってはエラーとなってしまいます。そのため、エラーを回避するための処理を追加で書く必要があります。
Ansibleでは設定変更やファイル作成などを行う前に、該当の設定値やファイルの有無をモジュールが確認してくれるため、別途確認処理を記述しなくても冪等性を確保できます。

再利用しやすい形でコードを開発できる

Ansibleではコードを分割することで再利用しやすい形での開発が可能です。
多くの機器に対して使用する処理を分割し使いまわすことで、システムが大規模になった際に開発コストの削減が見込めます。

記述方法の統一

AnsibleのコードはYAMLという形式で書く必要があります。また、Ansibleのコードでは変数の宣言や処理を記述するディレクティブが決まっています。そのため、スクリプトと比べて誰が書いても統一感のあるコードになりやすいです。
また、Ansibleではディレクトリやファイルを名前で判別し読み込みます。そのため、必然的に名前が統一され乱雑になることもありません。

自動化の対象を増やせる

Terraformが管理できるリソースはプロバイダーが提供されているものに限られますが、AnsibleはSSH接続できれば管理可能なため、今までは自動化の範囲外だった機器も自動化の対象にすることが可能です。 例:オンプレミスのルータやスイッチ、セキュリティ製品など  
 

まとめ

本記事ではAnsibleとTerraformの違い、使い分けについて説明してきました。
内容を簡単にまとめると。
・得意な領域が異なるため自動化を行いたい対象、範囲によって使うツールを選び使い分ける。
・オンプレミスのNW機器やセキュリティ製品、OSレイヤ以上の自動化はAnsibleが得意とする領域
・ハイパーバイザーやクラウドサービス上のリソースの自動化はTerraformが得意とする領域
となります。
 
また、この2つのツールは連携させて併用することが可能です。
連携時はAnsibleからTerraformを呼び出すことも、TerraformからAnsibleを呼び出すこともできます。
連携させることでお互いの強みを活かしつつ自動化の範囲を広げることができるので、自動化対象の範囲によっては両方とも導入することを検討してください。
連携、併用の具体的な方法については次回掲載予定の記事で説明します。