scud 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'gli'
4
+ require 'scud'
5
+
6
+ include GLI::App
7
+
8
+ program_desc <<DESC
9
+ create and terminate VMs in the cloud and bootstrap your favourite CM tool (puppet, chef etc)
10
+ DESC
11
+
12
+ config_file 'scud/config.yaml'
13
+
14
+ commands_from('scud/ui')
15
+ version Scud::VERSION
16
+
17
+ on_error do |exception|
18
+ # Error logic here
19
+ # return false to skip default error handling
20
+ true
21
+ end
22
+
23
+ exit run(ARGV)
@@ -0,0 +1,19 @@
1
+ #FIXME: find better way of setting the paths to the required tasks
2
+ #
3
+ require "#{ENV['HOME']}/scud/tasks/apt"
4
+ require "#{ENV['HOME']}/scud/tasks/puppet"
5
+
6
+
7
+ set :user, 'ubuntu'
8
+ set :ssh_options, { :forward_agent => true }
9
+
10
+ #FIXME: how to get scud to ask for sudo password ?
11
+ set :use_sudo, true
12
+
13
+ ssh_options[:keys] = "~/.ssh/ec2/aws-sydney.pem"
14
+
15
+
16
+ task :bootstrap do
17
+ aptupgrade
18
+ puppet_client
19
+ end
@@ -0,0 +1,32 @@
1
+ Capistrano::Configuration.instance(:must_exist).load do
2
+ desc <<-DESC
3
+ noninteractive apt-get upgrade.
4
+
5
+ This task will complete an 'apt-get update' and then an 'apt-get upgrade'
6
+
7
+ *WARNING* the following flags are passed to 'apt-get upgrade'
8
+
9
+ * DEBIAN_FRONTEND=noninteractive
10
+ * --yes
11
+
12
+ Options:
13
+
14
+ HOSTFILTER='fqdn' # fqdn of host to upgrade
15
+ ROLES='web' # group of hosts to upgrade
16
+ FORCE=true # add --allow-unauthenticated for unsigned packages
17
+
18
+ Examples:
19
+
20
+ cap node:aptupgrade HOSTS='foo.example.com'
21
+ cap node:aptupgrade HOSTFILTER='foo.example.com' FORCE=true
22
+
23
+ DESC
24
+ task :aptupgrade do
25
+ run "#{sudo} apt-get update -yq"
26
+ if ENV['FORCE']
27
+ run "#{sudo} DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes --allow-unauthenticated"
28
+ else
29
+ run "#{sudo} DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes --quiet"
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ Capistrano::Configuration.instance(:must_exist).load do
2
+ desc 'bootstrap puppet client.'
3
+ task :puppet_client do
4
+ #puts "Bootstrapping new Puppet client".green
5
+ # clean the slate
6
+ run "#{sudo} aptitude purge -y ~npuppet libaugeas-ruby ~nrubygems"
7
+ run "#{sudo} rm -rf /etc/puppet"
8
+ #
9
+ # add puppetlabs apt repos
10
+ filename = "/etc/apt/sources.list.d/puppetlabs.list"
11
+ run "echo 'deb http://apt.puppetlabs.com/ precise main' | #{sudo} tee #{filename}"
12
+ run "#{sudo} apt-key adv --keyserver keyserver.ubuntu.com --recv 4BD6EC30"
13
+ run "#{sudo} apt-get -yq update"
14
+ #
15
+ run "#{sudo} apt-get install -yq ruby ruby1.8 rubygems libaugeas-ruby git"
16
+ run "#{sudo} apt-get install -yq puppet=2.7.20-1puppetlabs1 puppet-common=2.7.20-1puppetlabs1"
17
+
18
+ # Prep puppet.conf so the first Puppet run works.
19
+ puppet_dot_conf = <<-END.gsub(/^ {8}/, '')
20
+ [main]
21
+ logdir=/var/log/puppet
22
+ vardir=/var/lib/puppet
23
+ ssldir=/var/lib/puppet/ssl
24
+ rundir=/var/run/puppet
25
+ factpath=$vardir/lib/facter
26
+ templatedir=$confdir/templates
27
+ pluginsync=true
28
+ END
29
+ put puppet_dot_conf, "/tmp/puppet.conf.new"
30
+ run "#{sudo} cp /tmp/puppet.conf.new /etc/puppet/puppet.conf"
31
+ end
32
+ end
@@ -0,0 +1,10 @@
1
+ require 'scud/version'
2
+ require 'scud/provider'
3
+ require 'scud/provisioner/capistrano'
4
+
5
+ # Add requires for other files you add to your project here, so
6
+ # you just need to require this one file in your bin file
7
+
8
+ require 'pp'
9
+ require 'fog'
10
+ require 'table_print'
@@ -0,0 +1 @@
1
+ require 'scud/provider/ec2'
@@ -0,0 +1,76 @@
1
+ module Scud
2
+ module Provider
3
+ module EC2
4
+ extend self
5
+
6
+ # use fog to talk to AWS/ec2
7
+ #
8
+ def create(options={})
9
+ # check all required fog creds are supplied
10
+ #TODO: #validate_creds(options)
11
+
12
+ # connect to ec2
13
+ #
14
+ connect(options)
15
+
16
+ # create an instance
17
+ #
18
+ server = @fog.servers.create(
19
+ :image_id => options[:ami],
20
+ :flavor_id => options[:size],
21
+ :key_name => options[:keypair],
22
+ :groups => options[:security],
23
+ :tags => { 'Name' => options[:name] }
24
+ )
25
+
26
+ # print progress as dots whilst waiting for it to get online
27
+ #
28
+ server.wait_for { print "."; ready? }
29
+ puts
30
+ tp server, :id, {:dns_name => {:width => 65}}, :public_ip_address, :private_ip_address, :tags, :flavor_id, :key_name, :security_group_ids
31
+ server
32
+ end
33
+
34
+ # list all instances in a region
35
+ #
36
+ def list(options={})
37
+ connect(options)
38
+ servers = @fog.servers.all
39
+ tp servers, :id, :availability_zone, :state, {:dns_name => {:width => 65}}, :public_ip_address, :private_ip_address, :tags, :flavor_id, :key_name, :security_group_ids
40
+ end
41
+
42
+ # terminate an instance
43
+ #
44
+ def terminate(options)
45
+ # connect to ec2
46
+ #
47
+ connect(options)
48
+
49
+ instances = @fog.servers.all
50
+ instance = instances.select {|i| i.dns_name == options[:dns_name] }
51
+ instance[0].destroy
52
+ instance[0].reload
53
+ while instance[0].state != "terminated" do
54
+ print '.'
55
+ sleep 3
56
+ instance[0].reload
57
+ end
58
+ puts "#{options[:dns_name]} has been terminated."
59
+ end
60
+
61
+ private
62
+
63
+ # create connection to AWS
64
+ # returns @fog object.
65
+ #
66
+ def connect(options={})
67
+ @fog ||= Fog::Compute.new(
68
+ :provider => 'aws',
69
+ :region => options[:region],
70
+ :aws_access_key_id => options[:aws_access_key_id],
71
+ :aws_secret_access_key => options[:aws_secret_access_key]
72
+ )
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,25 @@
1
+ require 'capistrano'
2
+ require 'capistrano/cli'
3
+
4
+ module Scud
5
+ module Provisioner
6
+ module Capistrano
7
+ extend self
8
+
9
+ def bootstrap(opts={})
10
+ config = ::Capistrano::Configuration.new
11
+ config.logger.level = ::Capistrano::Logger::TRACE
12
+ config.load "#{ENV['HOME']}/scud/bootstrap.rb"
13
+
14
+ config.default_run_options[:pty] = true
15
+
16
+ #TODO: find better way of parsing options to cap tasks
17
+ #
18
+ ENV['HOSTS'] = opts[:dns_name]
19
+
20
+ puts "\nbootstrapping #{ENV['HOSTS']}....."
21
+ config.bootstrap
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ desc 'bootstrap an instance'
2
+ long_desc '''
3
+ This will run all of the capistrano tasks declared in $HOME/scud/bootstrap.rb
4
+ '''
5
+ command :bootstrap do |c|
6
+
7
+ c.desc 'dns_name of instance to bootstrap'
8
+ c.long_desc 'What is the name of the instance you wish to bootstrap - eg: ec2-54-253-9-16.ap-southeast-2.compute.amazonaws.com'
9
+ c.flag :dns_name
10
+
11
+ c.desc 'EC2 region'
12
+ c.long_desc 'Which EC2 region ?'
13
+ c.default_value 'ap-southeast-2'
14
+ c.flag :region
15
+
16
+ c.action do |global_options, options, args|
17
+ opts=global_options.merge(options)
18
+ Scud::Provisioner::Capistrano.bootstrap(opts)
19
+ end
20
+ end
@@ -0,0 +1,64 @@
1
+ desc 'create a new instance'
2
+ command :create do |c|
3
+
4
+ c.desc 'ami id to use'
5
+ c.default_value 'ami-fb8611c1'
6
+ c.flag :ami
7
+
8
+ c.desc 'keypair to use'
9
+ c.long_desc 'What keypair to use for connecting to this instance ?'
10
+ c.default_value 'general'
11
+ c.flag :keypair
12
+
13
+ c.desc 'security group to apply'
14
+ c.long_desc 'What security group to add to this instance. Currently only one is supported.'
15
+ c.default_value 'default'
16
+ c.flag :security
17
+
18
+ c.desc 'size of instance'
19
+ c.default_value 't1.micro'
20
+ c.flag :size
21
+
22
+ c.desc 'EC2 region'
23
+ c.long_desc 'Which EC2 region do you want to bring up an instance in ?'
24
+ c.default_value 'ap-southeast-2'
25
+ c.flag :region
26
+
27
+ c.desc 'instance name'
28
+ c.long_desc 'Friendly name to display in AWS console'
29
+ c.flag :name
30
+
31
+ c.desc 'bootstrap host'
32
+ c.long_desc 'whether to bootstrap new instance or not.'
33
+ c.default_value true
34
+ c.switch :bootstrap
35
+
36
+ c.action do |global_options, options, args|
37
+ opts=global_options.merge(options)
38
+ server = Scud::Provider::EC2.create(opts)
39
+ if opts[:bootstrap]
40
+ server.wait_for { print '.'; openport?(server.public_ip_address, 22) }
41
+ Scud::Provisioner::Capistrano.bootstrap(opts.merge(:dns_name => server.dns_name))
42
+ puts "#{server.dns_name} has been bootstrapped."
43
+ else
44
+ puts "NOT bootstrapping #{server.dns_name}"
45
+ end
46
+ end
47
+ end
48
+
49
+ #FIXME: move method out of UI into a helper somewhere
50
+ #
51
+ def openport?(host,port)
52
+ require 'socket'
53
+ begin
54
+ aSock = Socket.new(:INET, :STREAM)
55
+ raw = Socket.sockaddr_in(port, host)
56
+ if aSock.connect(raw)
57
+ true
58
+ end
59
+ rescue (Errno::ECONNREFUSED)
60
+ false
61
+ rescue (Errno::ETIMEDOUT)
62
+ exit_now!('timed out waiting for instance to be available.')
63
+ end
64
+ end
@@ -0,0 +1,10 @@
1
+ # global flags and switches
2
+ #
3
+ desc 'aws access key id'
4
+ flag :aws_access_key_id
5
+
6
+ desc 'aws_secret_access_key'
7
+ flag :aws_secret_access_key
8
+
9
+ desc 'verbose'
10
+ switch [:verbose, :v], :negatable => false
@@ -0,0 +1,16 @@
1
+ desc 'list all instances in a region'
2
+ long_desc '''
3
+ This will list all instances running in a region.
4
+ '''
5
+ command :list do |c|
6
+
7
+ c.desc 'EC2 region'
8
+ c.long_desc 'Which EC2 region ?'
9
+ c.default_value 'ap-southeast-2'
10
+ c.flag :region
11
+
12
+ c.action do |global_options, options, args|
13
+ opts=global_options.merge(options)
14
+ Scud::Provider::EC2.list(opts)
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ desc 'terminate an instance'
2
+ command :terminate do |c|
3
+
4
+ c.desc 'dns_name of instance to terminate'
5
+ c.long_desc 'What is the name of the instance you wish to terminate - eg: ec2-54-253-9-16.ap-southeast-2.compute.amazonaws.com'
6
+ c.flag :dns_name
7
+
8
+ c.desc 'EC2 region'
9
+ c.long_desc 'Which EC2 region ?'
10
+ c.default_value 'ap-southeast-2'
11
+ c.flag :region
12
+
13
+ c.action do |global_options, options, args|
14
+ opts=global_options.merge(options)
15
+ #TODO: confirm before terminating (highline)
16
+ Scud::Provider::EC2.terminate(opts)
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module Scud
2
+ VERSION = '0.5.0'
3
+ end
@@ -0,0 +1,27 @@
1
+ # Ensure we require the local version and not one we might have installed already
2
+ require File.join([File.dirname(__FILE__),'lib','scud','version.rb'])
3
+
4
+ spec = Gem::Specification.new do |s|
5
+ s.name = 'scud'
6
+ s.version = Scud::VERSION
7
+ s.author = 'Mick Pollard'
8
+ s.email = 'aussielunix@gmail.com'
9
+ s.homepage = 'http://aussie.lunix.com.au'
10
+ s.platform = Gem::Platform::RUBY
11
+ s.summary = 'scud is for creating, terminating and bootstrapping VMs (cloud instances).'
12
+ # Add your other files here if you make them
13
+ s.files = Dir['Gemfile', 'scud.gemspec', '{bin,lib,ext}/**/**']
14
+ s.require_paths << 'lib'
15
+ s.has_rdoc = true
16
+ s.extra_rdoc_files = ['scud.rdoc']
17
+ s.rdoc_options << '--title' << 'scud' << '--main' << '-ri'
18
+ s.bindir = 'bin'
19
+ s.executables << 'scud'
20
+ s.add_development_dependency('rake')
21
+ s.add_development_dependency('rdoc')
22
+ s.add_development_dependency('aruba')
23
+ s.add_runtime_dependency('gli','2.5.6')
24
+ s.add_runtime_dependency('fog','1.10.0')
25
+ s.add_runtime_dependency('table_print')
26
+ s.add_runtime_dependency('capistrano')
27
+ end
@@ -0,0 +1,157 @@
1
+ == scud - create and terminate VMs in the cloud and bootstrap your favourite CM tool (puppet, chef etc)
2
+
3
+ v0.5.0
4
+
5
+ === Global Options
6
+ === --aws_access_key_id arg
7
+
8
+ aws access key id
9
+
10
+ [Default Value] AKIAJAP4RA36WAWRZROQ
11
+
12
+
13
+ === --aws_secret_access_key arg
14
+
15
+ aws_secret_access_key
16
+
17
+ [Default Value] WiG7podUPXvUx35YaNKIX54Xq66Gw6ET2ViJ+aTF
18
+
19
+
20
+ === --help
21
+ Show this message
22
+
23
+
24
+
25
+ === --verbose|-v
26
+ verbose
27
+
28
+
29
+
30
+ === --version
31
+
32
+
33
+
34
+
35
+ === Commands
36
+ ==== Command: <tt>bootstrap </tt>
37
+ bootstrap an instance
38
+
39
+ This will run all of the capistrano tasks declared in $HOME/scud/bootstrap.rb
40
+ ===== Options
41
+ ===== --dns_name arg
42
+
43
+ dns_name of instance to bootstrap
44
+
45
+ [Default Value] None
46
+ What is the name of the instance you wish to bootstrap - eg: ec2-54-253-9-16.ap-southeast-2.compute.amazonaws.com
47
+
48
+ ===== --region arg
49
+
50
+ EC2 region
51
+
52
+ [Default Value] ap-southeast-2
53
+ Which EC2 region ?
54
+
55
+ ==== Command: <tt>create </tt>
56
+ create a new instance
57
+
58
+
59
+ ===== Options
60
+ ===== --ami arg
61
+
62
+ ami id to use
63
+
64
+ [Default Value] ami-fb8611c1
65
+
66
+
67
+ ===== --keypair arg
68
+
69
+ keypair to use
70
+
71
+ [Default Value] aws-sydney
72
+ What keypair to use for connecting to this instance ?
73
+
74
+ ===== --name arg
75
+
76
+ instance name
77
+
78
+ [Default Value] None
79
+ Friendly name to display in AWS console
80
+
81
+ ===== --region arg
82
+
83
+ EC2 region
84
+
85
+ [Default Value] ap-southeast-2
86
+ Which EC2 region do you want to bring up an instance in ?
87
+
88
+ ===== --security arg
89
+
90
+ security group to apply
91
+
92
+ [Default Value] quicklaunch-1
93
+ What security group to add to this instance. Currently only one is supported.
94
+
95
+ ===== --size arg
96
+
97
+ size of instance
98
+
99
+ [Default Value] t1.micro
100
+
101
+
102
+ ===== --[no-]bootstrap
103
+ bootstrap host
104
+
105
+ whether to bootstrap new instance or not.
106
+
107
+ ==== Command: <tt>help command</tt>
108
+ Shows a list of commands or help for one command
109
+
110
+ Gets help for the application or its commands. Can also list the commands in a way helpful to creating a bash-style completion function
111
+ ===== Options
112
+ ===== -c
113
+ List commands one per line, to assist with shell completion
114
+
115
+
116
+
117
+ ==== Command: <tt>initconfig </tt>
118
+ Initialize the config file using current global options
119
+
120
+ Initializes a configuration file where you can set default options for command line flags, both globally and on a per-command basis. These defaults override the built-in defaults and allow you to omit commonly-used command line flags when invoking this program
121
+ ===== Options
122
+ ===== --[no-]force
123
+ force overwrite of existing config file
124
+
125
+
126
+
127
+ ==== Command: <tt>list </tt>
128
+ list all instances in a region
129
+
130
+ This will list all instances running in a region.
131
+ ===== Options
132
+ ===== --region arg
133
+
134
+ EC2 region
135
+
136
+ [Default Value] ap-southeast-2
137
+ Which EC2 region ?
138
+
139
+ ==== Command: <tt>terminate </tt>
140
+ terminate an instance
141
+
142
+
143
+ ===== Options
144
+ ===== --dns_name arg
145
+
146
+ dns_name of instance to terminate
147
+
148
+ [Default Value] None
149
+ What is the name of the instance you wish to terminate - eg: ec2-54-253-9-16.ap-southeast-2.compute.amazonaws.com
150
+
151
+ ===== --region arg
152
+
153
+ EC2 region
154
+
155
+ [Default Value] ap-southeast-2
156
+ Which EC2 region ?
157
+
metadata ADDED
@@ -0,0 +1,186 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: scud
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Mick Pollard
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-16 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rdoc
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: aruba
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: gli
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - '='
68
+ - !ruby/object:Gem::Version
69
+ version: 2.5.6
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - '='
76
+ - !ruby/object:Gem::Version
77
+ version: 2.5.6
78
+ - !ruby/object:Gem::Dependency
79
+ name: fog
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - '='
84
+ - !ruby/object:Gem::Version
85
+ version: 1.10.0
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - '='
92
+ - !ruby/object:Gem::Version
93
+ version: 1.10.0
94
+ - !ruby/object:Gem::Dependency
95
+ name: table_print
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: capistrano
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description:
127
+ email: aussielunix@gmail.com
128
+ executables:
129
+ - scud
130
+ extensions: []
131
+ extra_rdoc_files:
132
+ - scud.rdoc
133
+ files:
134
+ - Gemfile
135
+ - scud.gemspec
136
+ - bin/scud
137
+ - lib/scud/ui/terminate_command.rb
138
+ - lib/scud/ui/bootstrap_command.rb
139
+ - lib/scud/ui/list_command.rb
140
+ - lib/scud/ui/global_command.rb
141
+ - lib/scud/ui/create_command.rb
142
+ - lib/scud/provisioner/capistrano.rb
143
+ - lib/scud/provider.rb
144
+ - lib/scud/provider/ec2.rb
145
+ - lib/scud/version.rb
146
+ - lib/scud.rb
147
+ - ext/tasks/apt.rb
148
+ - ext/tasks/puppet.rb
149
+ - ext/bootstrap.rb
150
+ - scud.rdoc
151
+ homepage: http://aussie.lunix.com.au
152
+ licenses: []
153
+ post_install_message:
154
+ rdoc_options:
155
+ - --title
156
+ - scud
157
+ - --main
158
+ - -ri
159
+ require_paths:
160
+ - lib
161
+ - lib
162
+ required_ruby_version: !ruby/object:Gem::Requirement
163
+ none: false
164
+ requirements:
165
+ - - ! '>='
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ segments:
169
+ - 0
170
+ hash: -3751677803402973259
171
+ required_rubygems_version: !ruby/object:Gem::Requirement
172
+ none: false
173
+ requirements:
174
+ - - ! '>='
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ segments:
178
+ - 0
179
+ hash: -3751677803402973259
180
+ requirements: []
181
+ rubyforge_project:
182
+ rubygems_version: 1.8.23
183
+ signing_key:
184
+ specification_version: 3
185
+ summary: scud is for creating, terminating and bootstrapping VMs (cloud instances).
186
+ test_files: []