Skip to content

Instantly share code, notes, and snippets.

@mm53bar

mm53bar/Gemfile Secret

Created November 23, 2012 21:49
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save mm53bar/2427e5015487683305ed to your computer and use it in GitHub Desktop.
Save mm53bar/2427e5015487683305ed to your computer and use it in GitHub Desktop.
Build EC2 servers with Fog and Sunzi

Steps

  1. Clone this gist
  2. bundle install
  3. bundle exec sunzi create
  4. bundle exec foreman run rake

Recipes

Check out my sunzi-recipes to get some recipes for sunzi.

source 'http://rubygems.org'
gem 'sunzi'
gem 'rake'
gem 'fog'
gem 'foreman'
# Create, provision and destroy virtual servers for these examples at Amazon EC2
# ==============================================================================
begin
require 'fog'
rescue LoadError
puts "[!] Please install the 'fog' gem:", "", " $ gem install fog", ""
exit(1)
end
STDOUT.sync = true
AWS_ACCESS_KEY = ENV['AWS_ACCESS_KEY']
AWS_SECRET_KEY = ENV['AWS_SECRET_KEY']
AMI_ID = ENV['AMI_ID']
FLAVOR_ID = ENV['FLAVOR_ID']
REGION = ENV['REGION']
ROOT_USER = ENV['ROOT_USER']
APP_NAME = ENV['APP_NAME']
TAGGED_NAME = ENV['TAGGED_NAME']
unless AWS_ACCESS_KEY && AWS_SECRET_KEY
puts "[!] Error: Please provide your AWS credentials as environment variables for the script to continue...",
"export AWS_ACCESS_KEY_ID=<Your AWS access key>",
"export AWS_SECRET_ACCESS_KEY=<Your AWS secret access key>"
exit(1)
end
# Create connection to EC2
#
EC2 = Fog::Compute.new provider: 'AWS',
region: REGION,
aws_access_key_id: AWS_ACCESS_KEY,
aws_secret_access_key: AWS_SECRET_KEY
task :default => ['ec2:launch', 'ec2:provision']
namespace :ec2 do
desc "Launch and provision new micro instance via the Amazon Elastic Computing service"
task :launch do
print "Launching new server instance at EC2..."
# To find ami, search "precise 64 us east ebs" at
# http://cloud.ubuntu.com/ami/
# Prefer 64-bit instances
# http://alestic.com/2012/03/ec2-64-bit
# Prefer EBS Boot instances
# http://alestic.com/2012/01/ec2-ebs-boot-recommended
# Instance types
# t1.micro
# m1.small
Fog.credential = APP_NAME
s = EC2.servers.bootstrap image_id: AMI_ID,
flavor_id: FLAVOR_ID,
private_key_path: '~/.ssh/id_rsa',
public_key_path: '~/.ssh/id_rsa.pub',
tags: { Name: TAGGED_NAME },
username: ROOT_USER
puts "", "Started instance '#{s.id}' (#{s.flavor_id}) at #{s.dns_name}", '-'*80
puts s.tags
end
desc "Terminate a named server'"
task :terminate do
# Select all instances with the proper tag
#
servers = EC2.servers.select { |s| s.dns_name == ENV['server'] && s.state == "running" }
if servers.size < 1
puts "No servers running for testing deployment, exiting...", '-'*80
exit
end
puts "Terminating #{servers.size} running servers...", '-'*80
servers.each do |s|
puts "* #{s.id} (#{s.flavor.name})"
s.destroy
end
end
desc "Provision new server with Sunzi"
task :provision do
if ENV['server']
servers = EC2.servers.select { |s| s.dns_name == ENV['server'] && s.state == "running" }
else
servers = EC2.servers.select { |s| s.tags["Name"] == TAGGED_NAME && s.state == "running" }
end
servers.each do |server|
puts "Start provisioning for #{server.dns_name}", ""
sh %{ time bin/sunzi deploy #{ROOT_USER}@#{server.dns_name} --sudo }
end
end
desc "Display server name"
task :describe do
servers = EC2.servers.select { |s| s.tags["Name"] == TAGGED_NAME && s.state == "running" }
servers.each do |server|
puts "Server Info"
puts "-----------------------------------------"
puts "id: #{server.id}"
puts "dns_name: #{server.dns_name}"
puts "image_id: #{server.image_id}"
puts "flavor_id: #{server.flavor_id}"
end
end
desc "SSH to a named server"
task :ssh do
servers = EC2.servers.select { |s| s.dns_name == ENV['server'] && s.state == "running" }
puts "Connecting to #{servers.first.dns_name}"
exec "ssh #{ROOT_USER}@#{servers.first.dns_name}"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment