AWS
Ansible
タグ

AWS EC2 タグを指定してAnsibleを実行する

はじめに

Ansibleでサーバーに命令を実行する場合、インベントリーファイルに実行先サーバーのIPアドレスを定義する。一方でAWSのEC2はデフォルトでは再起動するたびにIPアドレスが変わってしまう。Elastic IPを使うとIPアドレスを固定することも可能であるが、費用もかかる。こんなときに便利なのがIPアドレスの代わりにAWS のEC2のタグを指定してAnsibleを実行する方法である。以下にその方法を紹介する。

前提

■ Ansibleサーバーが構築済、かつ対象サーバーとAnsible実行ユーザーでssh実行可能であること
 > 下の「手順」では例として、Ansible実行ユーザー名はansibleとする。

■ AWSコンソールでAnsible実行先サーバー(EC2)にタグが付与されていること
 > 下の「手順」では例として、付与されたタグはrole(キー)=webserver(値)とする。

■ AWSコンソールでIAM ユーザーのアクセスキーを作成済であること
 > 下の「手順」では例として、アクセスキーIDをxxxxxxxx、シークレットアクセスキーをyyyyyyyyとする。

手順

以下の手順は全てAnsibleサーバーにて実行する。

➀ アクセスキー情報を設定する

 # vi /home/ansible/.aws/credentials

※credentialsファイルはAnsible実行用sshユーザーのホームディレクトリーの下に置く。上の例ではansibleユーザーとしている。ユーザー名は適宜、読み替えること。

 credentialsファイル内に以下の3行を記載する。
 -----ここから-----
 [default]
 aws_access_key_id = xxxxxxxx
 aws_secret_access_key = yyyyyyyy
 -----ここまで-----

※xxxxxxxx/yyyyyyyyには実際の値を指定する。

② botoのインストール

botoはAWSを操作するためのPython SDKである。botoをインストールするためにはまずpythonのパッケージ管理ツールであるpipをyumでインストールし、pipでbotoをインストールする。

 # yum install python-pip
 # pip install boto

③ ec2.py/ec2.iniをgithubからダウンロードして編集する

ec2.pyはAWS EC2のインベントリー情報(タグ含む)を取得するスクリプトである。ec2.iniはec2.pyの設定ファイルである。

■ ダウンロード元
 > https://github.com/ansible/ansible/tree/devel/contrib/inventory

■ 配置先
 > ec2.py/ec2.iniともにインベントリーファイルの配置先と同じフォルダに配置する。
 > ec2.pyは配置後、chmodで実行権限を付与する。

■ ec2.iniの修正箇所
 ec2.iniは以下の箇所を修正する。(ec2.pyは修正不要)
 > region = ap-northeast-1a(修正)
 > instance_filters = tag:role=webserver(追加)
 > rds = false(コメントアウト解除)
 > elasticache = false(コメントアウト解除)
 > destination_variable = private_dns_name(修正)
 > vpc_destination_variable = private_ip_address(追加)
 > cache_max_age = 0(追加)

④ playbookのhostsの指定の修正

playbook内のhostsを指定している箇所にタグを使用するように修正する。

  • 修正例

    hosts: tag_role_webserver

※role(キー)およびwebserver(値)は適宜、読み替えること

⑤ playbookの実行確認

以下のplaybookコマンドを実行し、タグ指定したEC2がリストアップされることを確認する。

 # ansible-playbook -i <inventoryファイル> <playbookファイル> --list-hosts

以上