18
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

capistranoでリモート環境にデプロイと自分自身にデプロイ

Posted at

目的

awsのautoscalingに対応したデプロイ環境の実現。
awsでのwebアプリデプロイはここ参照
http://www.slideshare.net/AmazonWebServicesJapan/20130506-23096544
この資料のAuto Scalingでデプロイの項目。
実現出来そうではあるがハードコーディング感が否めない、
コマンド一発で実行出来る環境を構築して変更に強くしておきたい
(例えばcapistranoで自分自身にデプロイ出来るようにしておくとか、そうすればデプロイ手順が変更されてもcapistranoでデプロイに統一されていれば自ずと同じデプロイが実行される)
ElasticBeantalkは外部にあんまりソースコード置きたくないかな。。でも便利そう、超便利そう

課題

  • 自分自身にデプロイする
  • リモート環境にデプロイする時と同じ処理

てのが出来れば良い

capistrano-extインストール

環境毎に分けたデプロイ方法が実現できるプラグインの導入

gem install capistrano-ext

mkdir config/deploy
touch config/deploy/local.rb
touch config/deploy/remote.rb

vi config/deploy.rb
config/deploy.rb
# デプロイ環境が複数ある場合
set :stages, ["remote", "local"]
set :default_stage, "remote"

以下のように切り替えて実行する事が出来る

# config/deploy/remote.rbの記述が読み込まれる
cap deploy
cap remote deploy

# config/deploy/local.rbの記述が読み込まれる
cap local deploy

roleの記述を読み替える

実行を切り替えた時にroleの設定を切り替える

config/deploy.rb
set(:domain) { "#{domain}" }
role(:app) { domain }

remoteはELB配下のサーバーにデプロイ出来るようにawsのapi叩いてipの取得、vpc使ってip割り振っているので/etc/hostsで設定してあればその名前取得、なければipまま
(autoscalingやるとなるとip割り振りする必要無くなりそうですね)

config/deploy/remote.rb
require 'aws-sdk'
require 'resolv'

AWS.config({
  :access_key_id     => 'access_key_id',
  :secret_access_key => 'secret_access_key',
  :ec2_endpoint      => 'ec2.ap-northeast-1.amazonaws.com',
  :elb_endpoint      => 'elasticloadbalancing.ap-northeast-1.amazonaws.com'
})
elb = AWS::ELB.new.load_balancers['elb-name']
instances = elb.instances.select {|i| i.exists? && i.status == :running }.map(&:private_ip_address)

# /etc/hosts を参照してhostnameに変換、hostsファイルに記述無いとip表示
hostnames = []
hosts = Resolv::Hosts.new
instances.each {|ip|
    begin
        hostnames.push(hosts.getname(ip))
    rescue
        hostnames.push(ip)
    end
}

set :domain, hostnames
config/deploy/local.rb
set :domain, ['localhost']

これで下記コマンドでリモートとローカルでのデプロイを切り分ける事が出来た。

cap deploy
cap local deploy

os立ち上がった時にバージョン管理から最新になるパス作ってそこにcapistrano設置、autoscalingから起動したらそのパスのデプロイコマンド叩くとローカルにデプロイされるという環境が出来上がるであろう。
実際にautoscalingは実現出来てはいないが問題の一つは解消出来たと思われる。

後は毎回サーバーの変更あるたびにAMI作り直すの面倒なんでchef実行される環境作ったりとかですかね。

以上

18
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?