solutious-rudy 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,75 @@
1
+ RUDY, CHANGES
2
+
3
+ TODO: Look into RubyGems error
4
+ /Library/Ruby/Gems/1.8/gems/rake-0.8.3/lib/rake/gempackagetask.rb:13:Warning: Gem::manage_gems is deprecated and will be removed on or after March 2009.
5
+ rake aborted!
6
+ RubyGem version error: rdoc(2.4.0 not ~> 2.3.0)
7
+
8
+ TODO: Remove aws_swb
9
+
10
+
11
+ #### 0.4.1 (2009-03-??) ###############################
12
+
13
+ * CHANGE: Recommend keypair config to be in ~/.rudy/config
14
+ * FIX: Rudy now checks for user keys specified by env-role, env, and global
15
+ * FIX: gemspec dependency net-ssh-multi
16
+ * NEW: rerelease command
17
+
18
+ #### 0.4 (2009-03-12) ###############################
19
+
20
+ NOTE: This is a significant re-write from 0.3
21
+
22
+ * CHANGE: Mostly re-written bin/ruby, moving validation to Command classes
23
+ * CHANGE: upgrade to Drydock 0.5
24
+ * CHANGE: Moved generic EC2 commands to bin/rudy-ec2
25
+ * CHANGE: Removed ambiguity of pluralized command names.
26
+ * OLD: backups, disks, configs
27
+ * NEW: backup, disk, config
28
+ * NEW: ssh and scp commands for connecting to and copying files to/from machines
29
+ * NEW: New dependencies (trying out net-ssh)
30
+ * NEW: Domain specific language for configuration
31
+ * NEW: "Routines" for handling common actions. Starting, stopping, releasing, deploying.
32
+ * NEW: "rudy release" will create a release from the current working copy, start an instance,
33
+ checkout the release, run routines. It needs some work still, but this already functions as
34
+ a single command release process.
35
+ * NEW: "rudy start|destroy|restart|update|status". Routines allow us to have generic commands
36
+ that can be used for any machine group. These commands relate to starting new instances.
37
+ * NEW: Extra caution when running destructive commands
38
+ * NEW: Default ~/.rudy/config created if it doesn't exist.
39
+
40
+
41
+ #### 0.3 (2009-02-26) ###############################
42
+
43
+ NOTE: This is a significant re-write from 0.2
44
+
45
+ * CHANGE: Re-written support/rudy-ec2-startup
46
+ * CHANGE: upgrade to Drydock 0.4
47
+ * NEW: More functionality for disks and backups
48
+ * NEW: config commands
49
+ * NEW: Per machine configuration (via ~/.rudy)
50
+
51
+
52
+ #### 0.2 (2009-02-23) ###############################
53
+
54
+ NOTE: This is a complete re-write from 0.1
55
+
56
+ * CHANGE: Added Environment variables
57
+ * CHANGE: upgrade to drydock 0.3.3
58
+ * NEW: All time references are converted to UTC
59
+ * NEW: Safer "Are you sure?". Number of characters to enter is
60
+ commiserate with amount of danger.
61
+ * NEW: Commands: myaddress, addresses, images, instances,
62
+ disks, connect, copy, stage, backups, volumes
63
+ * NEW: Metadata storage to SimpleDB for disks, backups
64
+ * NEW: Creates EBS volumes based on startup from metadata
65
+ * NEW: Automated release process
66
+ * NEW: Automated creation of machine images
67
+ * NEW: Partial support for regions and zones
68
+ * NEW: Manage system based on security groups.
69
+ * NEW: "rudy groups" overhaul. Display, creates, destroys groups.
70
+
71
+
72
+
73
+ #### 0.1 (2009-02-06) ###############################
74
+
75
+ * Initial public release
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2009 Solutious Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
@@ -0,0 +1,36 @@
1
+ = Rudy - v0.4 ALPHA!
2
+
3
+ Rudy is a handy staging and deployment tool for EC2.
4
+
5
+ NOTE: Rudy will be ready for general consumption in Q2 2009.
6
+
7
+ == Installation
8
+
9
+ * Soon!
10
+ * ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION' (See net/ssh docs)
11
+
12
+ == More Info
13
+
14
+ * GitHub[http://github.com/solutious/rudy]
15
+ * RubyForge[http://rubyforge.org/projects/rudy]
16
+ * Inspiration[http://www.youtube.com/watch?v=CgaiIW5Rzes]
17
+
18
+
19
+ == Credits
20
+
21
+ * Delano Mandelbaum (delano@solutious.com)
22
+ * Keshia Knight Pulliam (rudy@solutious.com)
23
+
24
+
25
+ == Thanks
26
+
27
+ * The Rilli.com team -- for the initial use case, the ongoing feedback and support, and the good times!
28
+ * Adam Bognar
29
+ * Andrew Simpson
30
+ * Caleb Buxton
31
+ * Colin Brumelle
32
+
33
+
34
+ == License
35
+
36
+ See: LICENSE.txt
@@ -0,0 +1,68 @@
1
+ require 'rubygems'
2
+ require 'rake/clean'
3
+ require 'rake/gempackagetask'
4
+ require 'hanna/rdoctask'
5
+ require 'fileutils'
6
+ include FileUtils
7
+
8
+ task :default => :package
9
+
10
+ # SPECS ===============================================================
11
+
12
+ # None-yet!
13
+
14
+ # PACKAGE =============================================================
15
+
16
+ name = "rudy"
17
+ load "#{name}.gemspec"
18
+
19
+ version = @spec.version
20
+
21
+ Rake::GemPackageTask.new(@spec) do |p|
22
+ p.need_tar = true if RUBY_PLATFORM !~ /mswin/
23
+ end
24
+
25
+ task :release => [ :rdoc, :package ]
26
+
27
+ task :install => [ :rdoc, :package ] do
28
+ sh %{sudo gem install pkg/#{name}-#{version}.gem}
29
+ end
30
+
31
+ task :uninstall => [ :clean ] do
32
+ sh %{sudo gem uninstall #{name}}
33
+ end
34
+
35
+
36
+ # Rubyforge Release / Publish Tasks ==================================
37
+
38
+ desc 'Publish website to rubyforge'
39
+ task 'publish:rdoc' => 'doc/index.html' do
40
+ sh "scp -rp doc/* rubyforge.org:/var/www/gforge-projects/#{name}/"
41
+ end
42
+
43
+ desc 'Public release to rubyforge'
44
+ task 'publish:gem' => [:package] do |t|
45
+ sh <<-end
46
+ rubyforge add_release -o Any -a CHANGES.txt -f -n README.rdoc #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.gem &&
47
+ rubyforge add_file -o Any -a CHANGES.txt -f -n README.rdoc #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.tgz
48
+ end
49
+ end
50
+
51
+
52
+ Rake::RDocTask.new do |t|
53
+ t.rdoc_dir = 'doc'
54
+ t.title = @spec.summary
55
+ t.options << '--line-numbers' << '--inline-source' << '-A cattr_accessor=object'
56
+ t.options << '--charset' << 'utf-8'
57
+ t.rdoc_files.include('LICENSE.txt')
58
+ t.rdoc_files.include('README.rdoc')
59
+ t.rdoc_files.include('CHANGES.txt')
60
+ t.rdoc_files.include('bin/*')
61
+ t.rdoc_files.include('lib/*.rb')
62
+ t.rdoc_files.include('lib/**/*.rb')
63
+ end
64
+
65
+ CLEAN.include [ 'pkg', '*.gem', '.config', 'doc' ]
66
+
67
+
68
+
@@ -0,0 +1,175 @@
1
+ #!/usr/bin/ruby
2
+
3
+ # Rudy -- Your friend in staging and deploying to EC2
4
+ #
5
+ # See rudy -h for usage
6
+ #
7
+
8
+ RUDY_HOME = File.join(File.dirname(__FILE__), '..')
9
+ RUDY_LIB = File.join(RUDY_HOME, 'lib')
10
+ $:.unshift RUDY_LIB # Put our local lib in first place
11
+
12
+ require 'rubygems' if RUBY_VERSION < "1.9"
13
+ require 'date'
14
+ require 'drydock'
15
+ extend Drydock
16
+
17
+ project "Rudy" # This also runs require 'ruby'
18
+
19
+ global :A, :accesskey, String, "AWS Access Key"
20
+ global :S, :secretkey, String, "AWS Secret Access Key"
21
+ #global :R, :region, String, "Connect to a specific EC2 region (ie: #{Rudy::DEFAULT_REGION})"
22
+ global :f, :config, String, "Specify another configuration file to read (ie: #{Rudy::RUDY_CONFIG_FILE})"
23
+ global :z, :zone, String, "Connect to a specific EC2 zone (ie: #{Rudy::DEFAULT_ZONE})"
24
+ global :e, :environment, String, "Connect to the specified environment (ie: #{Rudy::DEFAULT_ENVIRONMENT})"
25
+ global :r, :role, String, "Connect to a machine with the specified role (ie: #{Rudy::DEFAULT_ROLE})"
26
+ global :p, :position, String, "Position in the machine in its group (ie: #{Rudy::DEFAULT_POSITION})"
27
+ global :u, :user, String, "Provide a username (ie: #{Rudy::DEFAULT_USER})"
28
+ global :q, :quiet, "Run with less output"
29
+ global :v, :verbose, "Increase verbosity of output (i.e. -v or -vv or -vvv)" do
30
+ @verbose ||= 0
31
+ @verbose += 1
32
+ end
33
+ global :V, :version, "Display version number" do
34
+ puts "Rudy version: #{Rudy::VERSION}"
35
+ exit 0
36
+ end
37
+
38
+ #desc "Run this the first time you use Rudy (it's immutable so running it again does no harm)."
39
+ #command :setup => Rudy::Command::Metadata
40
+
41
+
42
+ # ------------------------------------ RUDY INFO COMMANDS --------
43
+ # ------------------------------------------------------------------
44
+
45
+ #usage "rudy info"
46
+ #desc "Displays info about the current Rudy configuration"
47
+ #command :info => Rudy::Command::Metadata
48
+
49
+ usage "rudy [-f config-file] config [param-name]"
50
+ desc "Check Rudy configuration."
51
+ option :l, :all, "Display config settings for all machines"
52
+ option :d, :defaults, "Display the default value for the supplied parameter"
53
+ argv :name
54
+ command :config => Rudy::Command::Config
55
+
56
+ usage "rudy myaddress [-i] [-e]"
57
+ desc "Displays you current internal and external IP addresses"
58
+ option :e, :external, "Display only external IP address"
59
+ option :i, :internal, "Display only internal IP address"
60
+ command :myaddress do |obj|
61
+ ea = Rudy::Utils::external_ip_address || ''
62
+ ia = Rudy::Utils::internal_ip_address || ''
63
+ if obj.global.quiet
64
+ puts ia unless obj.option.external && !obj.option.internal
65
+ puts ea unless obj.option.internal && !obj.option.external
66
+ else
67
+ puts "%10s: %s" % ['Internal', ia] unless obj.option.external && !obj.option.internal
68
+ puts "%10s: %s" % ['External', ea] unless obj.option.internal && !obj.option.external
69
+ end
70
+ end
71
+
72
+
73
+
74
+ # ----------------------------- RUDY MAINTENANCE COMMANDS --------
75
+ # ------------------------------------------------------------------
76
+
77
+ usage "#{$/} [global options] disks [-C -p path -d device -s size] [-A] [-D] [disk name]"
78
+ desc "Manage Disks"
79
+ option :l, :all, "Display all disk definitions"
80
+ option :p, :path, String, "The filesystem path to use as the mount point"
81
+ option :d, :device, String, "The device id (default: /dev/sdh)"
82
+ option :s, :size, Integer, "The size of disk (in GB)"
83
+ action :C, :create, "Create a disk definition"
84
+ action :D, :destroy, "Destroy a disk definition"
85
+ action :A, :attach, "Attach a disk"
86
+ action :N, :unattach, "Unattach a disk"
87
+ argv :diskname
88
+ command :disk => Rudy::Command::Disks
89
+
90
+
91
+ usage "rudy [global options] backups [-C] [disk name]"
92
+ desc "Manage Backups"
93
+ option :s, :snapshot, String, "Create a backup entry from an existing snapshot"
94
+ action :Z, :sync, "Check for and delete backup metadata with no snapshot. DOES NOT delete snapshots."
95
+ #action :T, :tidy, "Tidy existing backups"
96
+ action :D, :destroy, "Destroy a backup and DELETE its snapshots."
97
+ action :C, :create, "Create a backup"
98
+ argv :disk
99
+ command :'backup' => Rudy::Command::Backups
100
+ command_alias :backup, :bu
101
+
102
+
103
+ usage "rudy [global options] metadata instance-ID"
104
+ desc "Display Rudy metadata."
105
+ command :metadata => Rudy::Command::Metadata
106
+ command_alias :metadata, :md
107
+
108
+
109
+ desc "Machine Group Status"
110
+ command :status => Rudy::Command::Machines
111
+
112
+
113
+ desc "Update a Machine Group with the current version of Rudy"
114
+ command :update => Rudy::Command::Machines
115
+
116
+
117
+ usage "rudy [-e env] [-u user] connect [-p] [cmd]"
118
+ desc "Open an SSH connection"
119
+ option :p, :print, "Only print the SSH command, don't connect"
120
+ argv :cmd
121
+ command :connect => Rudy::Command::Environment
122
+ command_alias :connect, :ssh
123
+
124
+ usage "rudy [-e env] [-u user] copy [-p] -r [from path] [to path]"
125
+ desc "Copy files to or from machines. NOTE: You must use quotes when using a tilda for your remote dir ('~/')."
126
+ option :r, :remote, "Copy FROM the remote machine to the local machine"
127
+ option :p, :print, "Only print the SSH command, don't connect"
128
+ argv :from, :to
129
+ command :copy => Rudy::Command::Environment
130
+ command_alias :copy, :scp
131
+ command_alias :copy, :upload
132
+ command_alias :copy, :download
133
+
134
+
135
+ # -------------------------------- RUDY ROUTINES COMMANDS --------
136
+ # ------------------------------------------------------------------
137
+
138
+ desc "Shutdown a Machine Group"
139
+ command :shutdown => Rudy::Command::Machines
140
+
141
+ desc "Start a Machine Group"
142
+ option :i, :image, String, "EC2 image ID (AMI)"
143
+ command :startup => Rudy::Command::Machines
144
+ command_alias :startup, :start
145
+
146
+ desc "Restart a Machine Group"
147
+ command :restart => Rudy::Command::Machines
148
+
149
+ desc "Release to a machine group"
150
+ option :s, :switch, "Switch to the release branch/tag"
151
+ option :m, :msg, String, "A short release note"
152
+ command :release => Rudy::Command::Release
153
+
154
+ desc "Update the release currently running in a machine group"
155
+ command :rerelease => Rudy::Command::Release
156
+ command_alias :rerelease, :rere
157
+
158
+ #desc "Deploy disk snapshots from one machine to another"
159
+ #command :deploy => Rudy::Command::Deploy
160
+
161
+
162
+
163
+
164
+ # ------------------------------------------- UGLY STUFFS --------
165
+ # ------------------------------------------------------------------
166
+ debug :on
167
+ capture :stderr
168
+ before do
169
+ @start = Time.now
170
+ end
171
+ after do
172
+ @elapsed = Time.now - @start
173
+ puts $/, "Elapsed: %.2f seconds" % @elapsed.to_f if @elapsed > 0.1
174
+ end
175
+
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/ruby
2
+
3
+ # Rudy -- Your friend in staging and deploying to EC2
4
+ #
5
+ # See rudy -h for usage
6
+ #
7
+
8
+ #
9
+ # No Ruby 1.9.1 support. Only 1.8.x for now :[
10
+ unless RUBY_VERSION < "1.9"
11
+ puts "Sorry! We're using the right_aws gem and it doesn't support Ruby 1.9 (md5 error)."
12
+ exit 1
13
+ else
14
+ require 'rubygems'
15
+ end
16
+
17
+ RUDY_HOME = File.join(File.dirname(__FILE__), '..')
18
+ RUDY_LIB = File.join(RUDY_HOME, 'lib')
19
+ $:.unshift RUDY_LIB # Put our local lib in first place
20
+
21
+ require 'drydock'
22
+ extend Drydock
23
+
24
+ project "Rudy" # This also runs require 'ruby'
25
+
26
+ debug :on
27
+
28
+ capture :stderr
29
+
30
+ global :A, :accesskey, String, "AWS Access Key"
31
+ global :S, :secretkey, String, "AWS Secret Access Key"
32
+ global :R, :region, String, "Connect to a specific EC2 region (default: #{Rudy::DEFAULT_REGION})"
33
+ global :z, :zone, String, "Connect to a specific EC2 zone (default: #{Rudy::DEFAULT_ZONE})"
34
+ global :q, :quiet, "Run with less output"
35
+ global :v, :verbose, "Increase verbosity of output (i.e. -v or -vv or -vvv)" do
36
+ @verbose ||= 0
37
+ @verbose += 1
38
+ end
39
+ global :V, :version, "Display version number" do
40
+ puts "Rudy version: #{Rudy::VERSION}"
41
+ exit 0
42
+ end
43
+
44
+
45
+
46
+
47
+
48
+ # ----------------------------------- AMAZON EC2 COMMANDS --------
49
+ # ------------------------------------------------------------------
50
+
51
+ usage "rudy [global options] addresses [-A address instance ID]"
52
+ desc "Manage Amazon Elastic IP addresses"
53
+ argv :address, :instanceid
54
+ action :A, :associate, "Associate an address to a running instance"
55
+ command :addresses => Rudy::Command::Addresses
56
+ command_alias :addresses, :address
57
+
58
+
59
+ usage "rudy images [-C -i name [-b bucket -a account]] [-D AMI-ID]"
60
+ desc "Manage EC2 Machine Images (AMIs)"
61
+ option :a, :account, String, "Your Amazon Account Number"
62
+ option :i, :image_name, String, "The name of the image"
63
+ option :p, :print, "Print-only (don't execute commands)"
64
+ option :b, :bucket_name, String, "The name of the bucket that will store the image"
65
+ action :C, :create, "Create an image"
66
+ #action :P, :prepare, "Prepare a running instance to be used as an image"
67
+ action :D, :destroy, "Deregister an image (currently _does not_ remove images files from S3)"
68
+ argv :ami
69
+ command :images => Rudy::Command::Images
70
+ command_alias :images, :image
71
+
72
+
73
+ desc "Manage EC2 Volumes"
74
+ action :D, :destroy, "Destroy a volume"
75
+ argv :vol
76
+ command :volumes => Rudy::Command::Volumes
77
+ command_alias :volumes, :volume
78
+
79
+
80
+ usage "rudy [global options] instances [-D] [-S -i image ID] [instance ID OR group name]"
81
+ desc "Manage EC2 Instances"
82
+ option :all, "Display all instances"
83
+ option :a, :address, String, "Amazon elastic IP"
84
+ option :i, :image, String, "Amazon machine image ID (ami)"
85
+ #option :v, :volume, String, "Amazon volume ID"
86
+ action :D, :destroy, "Destroy the given instance IDs. All data will be lost!"
87
+ #action :S, :start, "Start an instance"
88
+ #action :R, :restart, "Restart an instance"
89
+ argv :filter
90
+ command :instances => Rudy::Command::Instances
91
+ command_alias :instances, :instance
92
+
93
+
94
+ usage "rudy [global options] groups [-C] [-a IP addresses] [-p ports] [group name]"
95
+ desc "Manage EC2 Security Groups"
96
+ option :all, "Display all security groups"
97
+ option :r, :protocols, Array, "Comma-separated list of protocols. One of: tcp (default), udp, icmp"
98
+ option :p, :ports, Array, "List of comma-separated ports to authorize (default: 22,80,443)"
99
+ option :a, :addresses, Array, "List of comma-separated IP addresses to authorize (default: your external IP)"
100
+ action :C, :create, "Create a security group"
101
+ action :D, :destroy, "Destroy a security group"
102
+ action :M, :modify, "Modify a security group"
103
+ argv :group
104
+ command :groups => Rudy::Command::Groups
105
+ command_alias :groups, :group
106
+
107
+
108
+