Ansibleの標準モジュールでEC2のサーバー構築をしてみる

はじめに

はじめまして、多田です。

最近は環境構築にAnsibleを利用することが多くなりましたが、調べているとAWSのようなクラウド環境の構築についてもAnsibleはその多くを標準モジュールとして備えているようですので、いくつか試してみました。

どこまでやるか

標準モジュールを利用したPlaybookを作成し、以下の内容の構築・設定を行えるようにする。

  • セキュリティグループの作成
  • EC2インスタンスの作成
  • AMIの作成
  • CloudWatchの設定(オートリカバリ)

前提

  • AWSマネジメントコンソールで、サーバー構築に使用するIAMユーザが作成されていること
  • AWSマネジメントコンソールで、キーペアを登録してあること

準備

Pythonインストール

pyenv でpythonをインストールします。

Ansibleインストール

pipでAnsibleをインストールします。

botoインストール

pipで boto をインストールします(AnsibleのAWS関連モジュールを利用するのに必要)。

API接続情報設定

IAMユーザ作成時に設定したAPIの接続情報を、環境変数に設定します。

Dynamic Inventoryファイルダウンロード

Ansibleのリポジトリから
ec2.ini
ec2.py をダウンロードしておく。

Playbookの構成

├─ansible-playbook
 ├─development.yml
 ├─hosts
 │ └─development
 │  └─ec2.ini(準備段階でダウンロードした ec2.ini を設置する)
 │  └─ec2.py(準備段階でダウンロードした ec2.py を設置する。実行権限を付与しておく)
 ├─roles
 │ ├─ami
 │ │ └─tasks
 │ │  └─main.yml
 │ ├─cloud_watch
 │ │ └─tasks
 │ │  └─main.yml
 │ ├─ec2
 │ │ └─tasks
 │ │  └─main.yml
 │ ├─security_group
 │ │ └─tasks
 │ │  └─main.yml

Playbookの中身

development.yml

master playbookです。

roles/security_group/tasks/main.yml

ec2_group モジュールを使って、セキュリティグループを作成します。
インバウンドはsshのみを許可し、アウトバウンドは全ての通信を許可します。

roles/ec2/tasks/main.yml

ec2 モジュールを使って、EC2インスタンスを作成します。
EC2インスタンスにはdevelopmentというタグを付けます。

roles/ami/tasks/main.yml

ec2_ami モジュールを使って、AMIを作成します。

roles/cloud_watch/tasks/main.yml

ec2_metric_alarm モジュールを使って、CloudWatchの設定を行います。
Amazon Web Services ブログを参考に、オートリカバリを設定してみます。

Playbookの実行

以下のようにしてPlaybookを実行すると、環境構築が行われます。

ポイント

role のうち、
ami と
cloud_watch
の実行には、対象EC2インスタンスのインスタンスIDが必要となります。
インスタンスIDは、ec2_facts モジュールで取得できますが、その前に対象ホストを特定する必要があります。
対象ホストのIPアドレスを直接指定することもできますが、Ansibleには dynamic_inventory という仕組みが用意されているので、こちらを利用して対象ホストを指定します。
嬉しい事に、AnsibleにはEC2用のdynamic_inventoryが標準で用意されています。
※準備段階でダウンロードした
ec2.ini
ec2.py です。

development.yml(master playbook) で
hosts: tag_Name_development
という形で対象ホストを指定していますが、この場合は development というタグを付けたEC2インスタンスが対象ホストとなります。

ダウンロードしたec2.pyを直接実行してみるとわかりますが、タグ以外にもリージョンやインスタンスタイプ等で対象ホストを指定することもできるようです。

Comments are closed, but you can leave a trackback: Trackback URL.