module Capistrano::GetServers

Public Class Methods

extend(configuration) click to toggle source
# File lib/capistrano-getservers/get_servers.rb, line 11
def self.extend(configuration)
  configuration.load do
    Capistrano::Configuration.instance.load do

      _cset(:aws_secret_access_key, ENV['AWS_SECRET_ACCESS_KEY'])
      _cset(:aws_access_key_id, ENV['AWS_ACCESS_KEY_ID'])
      _cset(:rackspace_api_key, ENV['RACKSPACE_API_KEY'])
      _cset(:rackspace_username, ENV['RACKSPACE_USERNAME'])
      _cset(:default_role, :web)

      #############################################################
      # def get_servers
      #
      # Purpose: Retrieves a list of EC2 instances containing a tag
      #          list which matches a supplied hash.
      #
      #          Matching instances are applied to the Cap server
      #          list.
      #
      # Usage: get_servers {'app' => 'zumba', 'stack' => 'web'}
      #
      # Returns: Nothing
      #############################################################
      def get_servers(role=nil, region=nil, cli_tags)

        # Rackspace regions are a 3 letter code (i.e. 'ord')
        if region.size == 3
          rackspace = Fog::Compute.new(
            provider: 'Rackspace',
            rackspace_api_key: fetch(:rackspace_api_key),
            rackspace_username: fetch(:rackspace_username),
            rackspace_region: region
          )

          rackspace.servers.select do |rackspace_server|
            if cli_tags.include?(rackspace_server.name)
              server (rackspace_server.ipv4_address || rackspace_server.addresses['private']['addr']), (role || :web)
            end
          end

        else
          ec2 = Fog::Compute::AWS.new(
            aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
            aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
            region: region
          )

          ec2.servers.all.each do |instance|
            begin
              instance_tags = instance.tags.reject { |k,v| cli_tags[k] != instance.tags[k] }
              server (instance.public_ip_address || instance.private_ip_address), (role || :web) if instance_tags.eql?(cli_tags)
            rescue
            end
          end
        end

      end

      #############################################################
      # def parse
      #
      # Purpose: Parses a string object and returns a hash.
      #
      # Usage: parse 'k1:v1,k2:v2,k3:v3'
      #
      # Returns: {'k1' => 'v1', 'k2' => 'v2', 'k3' => 'v3'}
      #############################################################
      def parse tags
        return unless tags.class.eql? String
        tags.split(',').inject({}) { |hash, pair| Hash[*pair.split(':')].merge(hash) }
      end

    end
  end
end

Public Instance Methods

get_servers(role=nil, region=nil, cli_tags) click to toggle source

def get_servers

Purpose: Retrieves a list of EC2 instances containing a tag

list which matches a supplied hash.

Matching instances are applied to the Cap server
list.

Usage: get_servers {'app' => 'zumba', 'stack' => 'web'}

Returns: Nothing

# File lib/capistrano-getservers/get_servers.rb, line 34
def get_servers(role=nil, region=nil, cli_tags)

  # Rackspace regions are a 3 letter code (i.e. 'ord')
  if region.size == 3
    rackspace = Fog::Compute.new(
      provider: 'Rackspace',
      rackspace_api_key: fetch(:rackspace_api_key),
      rackspace_username: fetch(:rackspace_username),
      rackspace_region: region
    )

    rackspace.servers.select do |rackspace_server|
      if cli_tags.include?(rackspace_server.name)
        server (rackspace_server.ipv4_address || rackspace_server.addresses['private']['addr']), (role || :web)
      end
    end

  else
    ec2 = Fog::Compute::AWS.new(
      aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
      aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
      region: region
    )

    ec2.servers.all.each do |instance|
      begin
        instance_tags = instance.tags.reject { |k,v| cli_tags[k] != instance.tags[k] }
        server (instance.public_ip_address || instance.private_ip_address), (role || :web) if instance_tags.eql?(cli_tags)
      rescue
      end
    end
  end

end
parse(tags) click to toggle source

def parse

Purpose: Parses a string object and returns a hash.

Usage: parse 'k1:v1,k2:v2,k3:v3'

Returns: {'k1' => 'v1', 'k2' => 'v2', 'k3' => 'v3'}

# File lib/capistrano-getservers/get_servers.rb, line 78
def parse tags
  return unless tags.class.eql? String
  tags.split(',').inject({}) { |hash, pair| Hash[*pair.split(':')].merge(hash) }
end