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リソースを取得できれば。。」と思ってのんびり開発をしています。
対応リソースの要望や機能追加のアイデアがあれば是非。