はじめに
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
以上