AWS
Ansible

awsrmを使ってAWS EC2用のAnsible Dynamic Inventoryを作ってみる

awsrmで気楽にAWSのリソース情報を取得する例として、awsrmを使ってあるELB(my-elb)配下のEC2群に対してAnsibleでプロビジョニングをしてみます。

前提

  • 同じVPC内の踏み台インスタンスからAnsibleを実行するとします
  • SSHの公開鍵設定などは終わっているとします
  • Ansibleのsite.ymlの hosts には web が設定されているとします

gemのインストール

まずGemfileを作成します。

# Gemfile
source 'https://rubygems.org'

gem 'awsecrets'
gem 'awsrm'

awsecrets.gemはawscliのように各種AWS関係の環境変数を読み込んでくれるライブラリです (awspecの中で使われています)。

今回作成するinventory.rbで AWS_PROFILE を読み込んでAWSのクレデンシャルを設定して欲しいので利用します。

bundle installでgemをインストール

$ bundle install

inventory.rbの作成

#!/bin/bash bundle exec ruby

require 'awsecrets'
require 'awsrm'
require 'json'

# AWSのクレデンシャル情報の読み込み
Awsecrets.load

# my-elb 配下のEC2インスタンスの `private_ip_address` を取得
instance_private_ips = Awsrm::Ec2.all(elb: 'my-elb').map(&:private_ip_address)

# Dynamic Inventoryのフォーマットで出力
puts JSON.dump(web: instance_private_ips)

上記のRubyスクリプトで、ELB my-elb 配下のEC2のPrivate IPを取得してDynamic Inventoryのフォーマットで出力ができます。

ポイントとしては、Shebangを #!/bin/bash bundle exec ruby とすることでrbenvのRubyやBundler配下のgemを利用するようにしています。

Ansibleの実行

最後に実行権限を与えて

$ chmod +x inventory.rb

あとは ansible-playbook でプロビジョニングが可能です。

$ AWS_PROFILE=produciton ansible-playbook -i inventory.rb site.yml

awsrm

このようにawsrmは「直感的にAWSリソースを取得できれば。。」と思ってのんびり開発をしています。

対応リソースの要望や機能追加のアイデアがあれば是非。