かべぎわブログ

技術的なことについてかけたらいいな…

EC2 External Inventoryを利用してAnsibleのhostsを動的に管理する

Ansibleを利用した構成管理では、実行対象のホストをインベントリファイルと呼ばれるファイルに記載しておく必要があります。

以下のようなかんじ

[local]
localhosts

[test_server]
192.140.1.1
192.140.1.2

[web_server]
192.140.2.1

これだと、AWSでAutoScalingを利用した際や、新たにインスタンスをたてたときなどにこのインベントリファイルをメンテナンスし続けなければならなくなり、非常に面倒です。

これを解決するために、Ansible公式でEC2 External Inventoryというスクリプトが提供されています。
以下のec2.pyec2.iniがそのEC2 External Inventoryで利用するスクリプトと設定ファイルです。

github.com

実際に動かしてためしてみる

実際にEC2 External InventoryをEC2インスタンス上からためしてみます。

事前準備

ファイルのダウンロード

まず、Ansibleサーバ上にec2.pyec2.iniをダウンロードします。

$ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.py
$ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.ini

アクセス権限の設定

つづいて、AnsibleがAWSの環境を見に行くことができるようにAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYを環境変数に設定します。

$ export AWS_ACCESS_KEY_ID='AKIA1234567890'
$ export AWS_SECRET_ACCESS_KEY='secretkey1234567890'

AnsibleサーバもAWSで動いていて、インスタンスに適切にロールが適用されている場合はこの作業は必要ありません。

以上で事前準備は完了です!

ためしにec2.pyを動かしてみる

ec2.pyを単体で動かすと、以下のような情報がかえってきました。

$ ./ec2.py 
{
"_meta": {
  "ap-northeast-1a": [
    "172.140.1.1", 
    "172.140.1.2"
  ], 
  "tag_Name_kabegiwa_ansible_server": [
    "172.140.1.1"
  ], 
  "tag_Name_kabegiwa_ansible_client": [
    "172.140.1.2"
  ], 
  "type_t2_micro": [ 
    "172.140.1.2"
  ], 
  "type_t2_large": [ 
    "172.140.1.2"
  ], 
  "vpc_id_vpc_12345678": [
    "172.140.1.1", 
    "172.140.1.2"
  ]

AZやリージョン、タグ名などでまとまった情報がJSON形式で応答されていることがわかります。
このひとつひとつがAnsibleでいうグループになります。

Ansibleコマンドを実行する

実際にAnsibleを実行してみます。
Ansibleの-iオプションでec2.pyをわたしてあげるだけです。
たとえば、Nameタグがkabegiwa_ansible_clientのものにpingを実行してみます。

$ ansible -i ec2.py tag_Name_kabegiwa_ansible_client -u ec2-user --private-key='./himitsukagi.pem' -m ping
172.140.1.2 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

無事実行できました!

おわりに

このようにEC2 External Inventoryをつかうことで動的にAnsibleのインベントリファイルを作成することができます。

インフラのコード化と自動化がはかどりますね!!!

入門Ansible

入門Ansible