siddick/siddick

View on GitHub
lib/capistrano/ec2.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'aws/ec2'

Capistrano::Configuration.instance.load do

  # AWS authentication information
  set :aws_key,     lambda{ ENV["AWS_KEY"] || abort("Need AWS_KEY and AWS_SECRET") }
  set :aws_secret,  lambda{ ENV["AWS_SECRET"] || abort("Need AWS_KEY and AWS_SECRET") }

  # EC2 instance
  set :ec2_ami,           "ami-a7f539ce"
  set :ec2_instance_type, "t1.micro"
  set :ec2_key_pair,      lambda{ ec2_object.key_pairs.first.name }

  # EC2 tags
  set :ec2_name_key,      "Name"
  set :ec2_name,          lambda{ fetch(:application) }
  set :ec2_role_key,      "Role"
  set :ec2_role,          "web,app,db"

  # EC2 objects
  set :ec2_object, lambda{ AWS::EC2.new( :access_key_id => aws_key, :secret_access_key => aws_secret ) }
  set :ec2_filter, lambda{ ec2_object.instances.tagged(ec2_name_key).tagged_values(ec2_name) }

  namespace :ec2 do

    desc "Find the EC2 instances"
    task :find do
      unless @ec2_find_already_executed
        puts("Application: #{application}")
        ec2_filter.each{|instance|
          puts("Server: #{instance.ip_address} = #{instance.tags[ec2_role_key]}")
          roles = ( instance.tags[ec2_role_key] || ec2_role ).split(",")
          server( instance.ip_address, *roles, :primary => true )
        }
        @ec2_find_already_executed = true
      end
    end

    desc "Create EC2 instances"
    task :create do
      roles = (ENV["ROLE"] || ec2_role).split(",").uniq
      instance = ec2_object.instances.create( :image_id => ec2_ami,
        :instance_type => ec2_instance_type, :key_pair => ec2_key_pair )
      instance.tags[ec2_name_key] = ec2_name
      instance.tags[ec2_role_key] = roles.join(",")
      server( instance.ip_address, :new_machine, *roles )
    end

    task :destroy do
      ec2_filter.each{|instance|
        instance.destroy()
      }
    end

    task :stop do
      ec2_filter.each{|instance|
        instance.stop()
      }
    end
  end

  #before "deploy", "ec2:find"
  after "multistage:ensure", "ec2:find"

end