- Clone this gist
bundle install
bundle exec sunzi create
bundle exec foreman run rake
Check out my sunzi-recipes to get some recipes for sunzi.
bundle install
bundle exec sunzi create
bundle exec foreman run rake
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 |