mccloud 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +9 -5
- data/Gemfile.lock +1 -1
- data/bin/mccloud +39 -30
- data/lib/mccloud/command/bootstrap.rb +1 -1
- data/lib/mccloud/command/destroy.rb +3 -3
- data/lib/mccloud/command/init.rb +503 -3
- data/lib/mccloud/command/multi.rb +7 -0
- data/lib/mccloud/command/provision.rb +5 -2
- data/lib/mccloud/command/server.rb +10 -5
- data/lib/mccloud/command/ssh.rb +7 -1
- data/lib/mccloud/command/status.rb +14 -5
- data/lib/mccloud/command/up.rb +10 -11
- data/lib/mccloud/configurator/mccloud.rb +21 -1
- data/lib/mccloud/generators.rb +16 -3
- data/lib/mccloud/provisioner/chef_solo.rb +5 -2
- data/lib/mccloud/provisioner/puppet.rb +6 -2
- data/lib/mccloud/session.rb +13 -7
- data/lib/mccloud/templates/bootstrap-centos-rubysource-1.8.7.sh +26 -0
- data/lib/mccloud/templates/bootstrap-centos-rvm-1.8.7.sh +12 -0
- data/lib/mccloud/templates/bootstrap-centos-rvm-1.9.2.sh +12 -0
- data/lib/mccloud/templates/bootstrap-centos-rvm-ree-1.8.7.sh +12 -0
- data/lib/mccloud/templates/bootstrap-custom.sh +1 -0
- data/lib/mccloud/templates/bootstrap-ubuntu-rvm-1.8.7.sh +14 -0
- data/{ruby-bootstrap.sh → lib/mccloud/templates/bootstrap-ubuntu-system.sh} +1 -2
- data/lib/mccloud/util/iterator.rb +3 -4
- data/lib/mccloud/util/sshkey.rb +74 -0
- data/lib/mccloud/version.rb +1 -1
- data/mccloud.gemspec +1 -0
- metadata +13 -7
- data/lib/mccloud/templates/Mccloudfilet +0 -44
- data/ruby-bootstrap2.sh +0 -39
@@ -7,6 +7,7 @@ module Mccloud
|
|
7
7
|
def multi(selection=nil,command="who am i",options=nil)
|
8
8
|
trap("INT") { puts "we hit CTRL_C"; exit }
|
9
9
|
|
10
|
+
|
10
11
|
Net::SSH::Multi.start do |session|
|
11
12
|
# Connect to remote machines
|
12
13
|
ip2name=Hash.new
|
@@ -18,6 +19,12 @@ module Mccloud
|
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
22
|
+
unless options["sudo"].nil?
|
23
|
+
#check vm.sudo
|
24
|
+
sudo_cmd="sudo"
|
25
|
+
command="#{sudo_cmd} #{command}"
|
26
|
+
end
|
27
|
+
|
21
28
|
puts "Executing #{command}"
|
22
29
|
begin
|
23
30
|
session.exec("#{command}") do |ch, stream, data|
|
@@ -5,6 +5,7 @@ module Mccloud
|
|
5
5
|
|
6
6
|
def provision(selection=nil,options=nil)
|
7
7
|
on_selected_machines(selection) do |id,vm|
|
8
|
+
|
8
9
|
instance=vm.instance
|
9
10
|
instance.private_key_path=vm.private_key
|
10
11
|
instance.username = vm.user
|
@@ -13,9 +14,11 @@ module Mccloud
|
|
13
14
|
provisioner=@session.config.provisioners[vm.provisioner.to_s]
|
14
15
|
if provisioner.nil?
|
15
16
|
# We take the first provisioner defined
|
16
|
-
provisioner=@session.config.provisioners.first[1]
|
17
|
+
#provisioner=@session.config.provisioners.first[1]
|
18
|
+
else
|
19
|
+
puts "Starting provisioning on #{vm.name} with #{vm.provisioner} as provisioner"
|
20
|
+
provisioner.run(vm)
|
17
21
|
end
|
18
|
-
provisioner.run(vm)
|
19
22
|
end
|
20
23
|
##on_selected_machines(selection) do |id,vm|
|
21
24
|
#instance=PROVIDER.servers.get(id)
|
@@ -4,6 +4,7 @@ module Mccloud
|
|
4
4
|
module Command
|
5
5
|
def server(selection=nil,options=nil)
|
6
6
|
|
7
|
+
puts "Starting server mode"
|
7
8
|
trap("INT") { puts "You've hit CTRL-C . Stopping server now"; exit }
|
8
9
|
threads = []
|
9
10
|
on_selected_machines(selection) do |id,vm|
|
@@ -14,17 +15,21 @@ module Mccloud
|
|
14
15
|
ssh_options={ :keys => [ vm.private_key ], :paranoid => false, :keys_only => true}
|
15
16
|
Net::SSH.start(public_ip_address, vm.user, ssh_options) do |ssh|
|
16
17
|
vm.forwardings.each do |forwarding|
|
17
|
-
|
18
|
-
|
18
|
+
begin
|
19
|
+
puts "Forwarding remote port #{forwarding.remote} from #{vm.name} to local port #{forwarding.local}"
|
20
|
+
ssh.forward.local(forwarding.local, private_ip_address,forwarding.remote)
|
21
|
+
rescue Errno::EACCES
|
22
|
+
puts " Error - Access denied to forward remote port #{forwarding.remote} from #{vm.name} to local port #{forwarding.local}"
|
23
|
+
end
|
19
24
|
end
|
20
25
|
ssh.loop { true }
|
21
26
|
end
|
22
27
|
end
|
23
28
|
end
|
24
29
|
end
|
25
|
-
|
26
|
-
puts "and we continue here"
|
27
|
-
sleep 30
|
30
|
+
threads.each {|thr| thr.join}
|
31
|
+
#puts "and we continue here"
|
32
|
+
#sleep 30
|
28
33
|
end
|
29
34
|
end
|
30
35
|
end
|
data/lib/mccloud/command/ssh.rb
CHANGED
@@ -17,6 +17,10 @@ module Mccloud
|
|
17
17
|
|
18
18
|
name=selection
|
19
19
|
vm=@session.config.vms[name]
|
20
|
+
if vm.instance.nil?
|
21
|
+
puts "#{name} is not available anymore"
|
22
|
+
return
|
23
|
+
end
|
20
24
|
if vm.instance.state != "running"
|
21
25
|
puts "#{name} is not running, move along"
|
22
26
|
return
|
@@ -36,7 +40,9 @@ module Mccloud
|
|
36
40
|
pid = fork if Mccloud::Util::Platform.leopard? || Mccloud::Util::Platform.tiger?
|
37
41
|
|
38
42
|
command_exec="ssh #{command_options.join(" ")} #{options[:username]}@#{options[:host]} #{extra_command}".strip
|
39
|
-
|
43
|
+
|
44
|
+
puts "Executing - #{command_exec}"
|
45
|
+
puts
|
40
46
|
Kernel.exec command_exec if pid.nil?
|
41
47
|
Process.wait(pid) if pid
|
42
48
|
end
|
@@ -2,11 +2,13 @@ module Mccloud
|
|
2
2
|
module Command
|
3
3
|
def status(selection=nil,options=nil)
|
4
4
|
|
5
|
-
printf "%-10s %-12s %-20s %-15s %-8s\n", "Name", "Instance Id", "IP", "Type","Status"
|
6
|
-
80.times { |i| printf "=" } ; puts
|
7
|
-
|
8
5
|
unless options.verbose?
|
9
|
-
|
6
|
+
|
7
|
+
filter=@session.config.mccloud.filter
|
8
|
+
puts "Using Filter: #{filter}"
|
9
|
+
|
10
|
+
printf "%-10s %-12s %-20s %-15s %-8s\n", "Name", "Instance Id", "IP", "Type","Status"
|
11
|
+
80.times { |i| printf "=" } ; puts
|
10
12
|
else
|
11
13
|
filter=""
|
12
14
|
end
|
@@ -21,8 +23,15 @@ module Mccloud
|
|
21
23
|
if name.start_with?(filter)
|
22
24
|
unless filter==""
|
23
25
|
name[filter+" - "]=""
|
26
|
+
printf "%-10s %-12s %-20s %-15s %-8s\n",name,vm.id, vm.public_ip_address, vm.flavor.name,vm.state
|
27
|
+
else
|
28
|
+
puts "Name: #{name}"
|
29
|
+
puts "Instance Id: #{vm.id}"
|
30
|
+
puts "Public Ip: #{vm.public_ip_address}"
|
31
|
+
puts "Flavor: #{vm.flavor.name}"
|
32
|
+
puts "State: #{vm.state}"
|
33
|
+
80.times { |i| printf "=" } ; puts
|
24
34
|
end
|
25
|
-
printf "%-10s %-12s %-20s %-15s %-8s\n",name,vm.id, vm.public_ip_address, vm.flavor.name,vm.state
|
26
35
|
end
|
27
36
|
end #End 1 provider
|
28
37
|
end #providers
|
data/lib/mccloud/command/up.rb
CHANGED
@@ -10,26 +10,23 @@ module Mccloud
|
|
10
10
|
|
11
11
|
provider=@session.config.providers[vm.provider]
|
12
12
|
if (id.nil?)
|
13
|
-
puts "Machine #{vm.name} doesn't yet exist"
|
14
13
|
provider_options=vm.provider_options
|
15
14
|
boxname=vm.name
|
16
15
|
puts "Spinning up a new machine called #{boxname}"
|
17
16
|
|
18
17
|
provider_options=provider_options.merge({ :private_key_path => vm.private_key , :public_key_path => vm.public_key, :username => vm.user})
|
19
18
|
|
20
|
-
#
|
21
|
-
instance=provider.servers.bootstrap(provider_options)
|
19
|
+
#instance=provider.servers.bootstrap(provider_options)
|
22
20
|
|
23
|
-
|
21
|
+
instance=provider.servers.create(provider_options)
|
24
22
|
#instance=provider.servers.create(provider_options)
|
25
23
|
|
26
|
-
puts "Waiting for
|
24
|
+
puts "Waiting for the machine to become accessible"
|
27
25
|
instance.wait_for { printf "."; STDOUT.flush; ready?}
|
28
26
|
puts
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
provider.create_tags(instance.id, { "Name" => "#{prefix} - #{boxname}"})
|
27
|
+
filter=@session.config.mccloud.filter
|
28
|
+
|
29
|
+
provider.create_tags(instance.id, { "Name" => "#{filter} - #{boxname}"})
|
33
30
|
|
34
31
|
# Resetting the in memory model of the new machine
|
35
32
|
@all_servers[boxname.to_s]=instance.id
|
@@ -39,6 +36,8 @@ module Mccloud
|
|
39
36
|
|
40
37
|
# Wait for ssh to become available ...
|
41
38
|
puts "Waiting for ssh to be come available"
|
39
|
+
#puts instance.console_output.body["output"]
|
40
|
+
|
42
41
|
Mccloud::Util.execute_when_tcp_available(instance.public_ip_address, { :port => 22, :timeout => 60 }) do
|
43
42
|
puts "Ok, ssh is available , proceeding with bootstrap"
|
44
43
|
end
|
@@ -48,12 +47,12 @@ module Mccloud
|
|
48
47
|
else
|
49
48
|
state=vm.instance.state
|
50
49
|
if state =="stopped"
|
51
|
-
puts "
|
50
|
+
puts "Booting up machine #{vm.name}"
|
52
51
|
vm.instance.start
|
53
52
|
vm.instance.wait_for { printf ".";STDOUT.flush; ready?}
|
54
53
|
puts
|
55
54
|
else
|
56
|
-
puts "Machine #{selection}
|
55
|
+
puts "Machine #{selection} is already running."
|
57
56
|
end
|
58
57
|
end
|
59
58
|
|
@@ -2,12 +2,32 @@ module Mccloud
|
|
2
2
|
module Configurator
|
3
3
|
class MccloudConfigurator
|
4
4
|
attr_accessor :prefix
|
5
|
+
attr_accessor :environment
|
6
|
+
|
7
|
+
attr_accessor :identity
|
5
8
|
attr_accessor :loglevel
|
6
9
|
|
7
10
|
def initialize()
|
8
11
|
@prefix="mccloud"
|
12
|
+
@environment=""
|
13
|
+
@identity=""
|
9
14
|
@loglevel=:info
|
10
|
-
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def filter()
|
18
|
+
mcfilter=Array.new
|
19
|
+
if !@prefix.nil?
|
20
|
+
mcfilter << @prefix
|
21
|
+
end
|
22
|
+
if @environment!=""
|
23
|
+
mcfilter << @environment
|
24
|
+
end
|
25
|
+
if @identity!=""
|
26
|
+
mcfilter << @identity
|
27
|
+
end
|
28
|
+
return mcfilter.join(" - ")
|
29
|
+
end
|
30
|
+
|
11
31
|
end
|
12
32
|
end
|
13
33
|
end
|
data/lib/mccloud/generators.rb
CHANGED
@@ -11,11 +11,24 @@ module Mccloud
|
|
11
11
|
|
12
12
|
desc <<-DESC
|
13
13
|
Initialize a mccloud environment
|
14
|
-
mccloud init
|
14
|
+
mccloud init [ --imageId=ID]
|
15
15
|
DESC
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
option :mcPrefix, :required => true, :desc => 'Mccloud Prefix'
|
18
|
+
option :mcEnvironment, :required => true, :desc => 'Mccloud Environment'
|
19
|
+
option :mcIdentity, :required => true, :desc => 'Mccloud Identity'
|
20
|
+
|
21
|
+
option :imageId, :required => true, :desc => 'Image ID'
|
22
|
+
option :userName, :required => true, :desc => 'User Name'
|
23
|
+
option :flavorId, :required => true, :desc => 'Flavor Id'
|
24
|
+
option :providerId, :required => true, :desc => 'Provider Id'
|
25
|
+
option :securityGroup, :required => true, :desc => 'Security Group'
|
26
|
+
option :keyName, :required => true, :desc => 'Key Name'
|
27
|
+
option :publicKeyPath, :required => false, :desc => 'Path to Public Key'
|
28
|
+
option :privateKeyPath, :required => true, :desc => 'Path to Private Key'
|
29
|
+
|
30
|
+
option :availabilityZone, :required => true, :desc => 'Availability Zone'
|
31
|
+
|
19
32
|
template :mccloudfile, 'Mccloudfile'
|
20
33
|
|
21
34
|
end
|
@@ -44,8 +44,11 @@ module Mccloud
|
|
44
44
|
|
45
45
|
puts "Running chef-solo"
|
46
46
|
options={ :port => 22, :keys => [ vm.private_key ], :paranoid => false, :keys_only => true}
|
47
|
-
|
48
|
-
|
47
|
+
if vm.user=="root"
|
48
|
+
Mccloud::Util.ssh(vm.instance.public_ip_address,vm.user,options,"sudo chef-solo -c /tmp/solo.rb -j /tmp/dna.json -l debug")
|
49
|
+
else
|
50
|
+
Mccloud::Util.ssh(vm.instance.public_ip_address,vm.user,options,"chef-solo -c /tmp/solo.rb -j /tmp/dna.json -l debug")
|
51
|
+
end
|
49
52
|
end
|
50
53
|
# Returns the run list for the provisioning
|
51
54
|
def run_list
|
@@ -27,12 +27,16 @@ module Mccloud
|
|
27
27
|
# Mccloud::Util.rsync(path,vm,vm.instance)
|
28
28
|
# end
|
29
29
|
vm.instance.ssh("mkdir -p #{@pp_path}")
|
30
|
+
puts "Synching manifest #{@manifest_file}"
|
30
31
|
vm.instance.scp(@manifest_file,"#{@pp_path}/manifest.pp")
|
31
32
|
|
32
33
|
puts "Running puppet"
|
33
34
|
options={ :port => 22, :keys => [ vm.private_key ], :paranoid => false, :keys_only => true}
|
34
|
-
|
35
|
-
|
35
|
+
if vm.user=="root"
|
36
|
+
Mccloud::Util.ssh(vm.instance.public_ip_address,vm.user,options,"puppet #{@pp_path}/manifest.pp")
|
37
|
+
else
|
38
|
+
Mccloud::Util.ssh(vm.instance.public_ip_address,vm.user,options,"sudo puppet #{@pp_path}/manifest.pp")
|
39
|
+
end
|
36
40
|
end
|
37
41
|
end #Class
|
38
42
|
end #Module Provisioners
|
data/lib/mccloud/session.rb
CHANGED
@@ -41,7 +41,7 @@ module Mccloud
|
|
41
41
|
|
42
42
|
def initialize(options=nil)
|
43
43
|
@logger = Logger.new(STDOUT)
|
44
|
-
@logger.level = Logger::
|
44
|
+
@logger.level = Logger::INFO
|
45
45
|
|
46
46
|
#http://www.ruby-doc.org/stdlib/libdoc/logger/rdoc/classes/Logger.html
|
47
47
|
@logger.datetime_format = "%Y-%m-%d %H:%M:%S"
|
@@ -120,6 +120,7 @@ module Mccloud
|
|
120
120
|
fogfile=File.new("#{File.join(ENV['HOME'],".fog")}","w")
|
121
121
|
fogfile.puts "#{snippet}"
|
122
122
|
fogfile.close
|
123
|
+
FileUtils.chmod(0600,fogfile)
|
123
124
|
else
|
124
125
|
puts "Ok, we won't write it, but we continue with your credentials in memory"
|
125
126
|
exit -1
|
@@ -132,23 +133,28 @@ module Mccloud
|
|
132
133
|
exit -1
|
133
134
|
end
|
134
135
|
end
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
|
140
|
+
|
135
141
|
end
|
136
142
|
end
|
137
143
|
|
138
144
|
invalid_cache=false
|
139
145
|
@session.config.vms.each do |name,vm|
|
140
|
-
|
146
|
+
filter=@session.config.mccloud.filter
|
141
147
|
id=@all_servers["#{name.to_s}"]
|
142
148
|
|
143
149
|
#Check if not destroyed or something else
|
144
150
|
instance=vm.instance
|
145
151
|
if instance.nil?
|
146
|
-
@logger.
|
152
|
+
@logger.debug "Cache is invalid"
|
147
153
|
invalid_cache=true
|
148
154
|
else
|
149
155
|
if instance.state == "shutting-down" || instance.state == "terminated"
|
150
|
-
@logger.
|
151
|
-
@logger.
|
156
|
+
@logger.debug "parsing .mccloud json"
|
157
|
+
@logger.debug "rebuilding cache"
|
152
158
|
invalid_cache=true
|
153
159
|
end
|
154
160
|
end
|
@@ -172,10 +178,10 @@ module Mccloud
|
|
172
178
|
end
|
173
179
|
servers_by_provider[name]=server_list
|
174
180
|
end
|
175
|
-
|
181
|
+
filter=@session.config.mccloud.filter
|
176
182
|
|
177
183
|
@session.config.vms.each do |name,vm|
|
178
|
-
id=servers_by_provider[vm.provider]["#{
|
184
|
+
id=servers_by_provider[vm.provider]["#{filter} - #{name.to_s}"]
|
179
185
|
|
180
186
|
|
181
187
|
if !id.nil?
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#http://www.catapult-creative.com/2009/02/04/installing-rails-on-centos-5/
|
2
|
+
|
3
|
+
yum install -y httpd-devel openssl-devel zlib-devel gcc gcc-c++ curl-devel expat-devel gettext-devel
|
4
|
+
|
5
|
+
mkdir /usr/local/src
|
6
|
+
cd /usr/local/src
|
7
|
+
curl -O ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.tar.gz
|
8
|
+
tar xzvf ruby-1.8.7-p72.tar.gz
|
9
|
+
cd ruby-1.8.7-p72
|
10
|
+
./configure --enable-shared --enable-pthread
|
11
|
+
make
|
12
|
+
make install
|
13
|
+
|
14
|
+
|
15
|
+
cd /usr/local/src
|
16
|
+
wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz
|
17
|
+
tar xzvf rubygems-1.3.5.tgz
|
18
|
+
cd rubygems-1.3.5
|
19
|
+
ruby setup.rb
|
20
|
+
gem install rubygems-update
|
21
|
+
update_rubygems
|
22
|
+
|
23
|
+
|
24
|
+
gem install chef --no-ri --no-rdoc
|
25
|
+
gem install puppet --no-ri --no-rdoc
|
26
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/bin/bash -ex
|
2
|
+
|
3
|
+
yum install -y bash curl git
|
4
|
+
bash < <(curl -s -B https://rvm.beginrescueend.com/install/rvm)
|
5
|
+
yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel lib
|
6
|
+
yaml-devel libffi-devel openssl-devel
|
7
|
+
source /usr/local/rvm/scripts/rvm
|
8
|
+
rvm install ruby-1.8.7
|
9
|
+
rvm use 1.8.7 --default
|
10
|
+
|
11
|
+
gem install chef --no-ri --no-rdoc
|
12
|
+
gem install puppet --no-ri --no-rdoc
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/bin/bash -ex
|
2
|
+
|
3
|
+
yum install -y bash curl git
|
4
|
+
bash < <(curl -s -B https://rvm.beginrescueend.com/install/rvm)
|
5
|
+
yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel lib
|
6
|
+
yaml-devel libffi-devel openssl-devel
|
7
|
+
source /usr/local/rvm/scripts/rvm
|
8
|
+
rvm install ruby-1.9.2
|
9
|
+
rvm use 1.9.2 --default
|
10
|
+
|
11
|
+
gem install chef --no-ri --no-rdoc
|
12
|
+
gem install puppet --no-ri --no-rdoc
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/bin/bash -ex
|
2
|
+
|
3
|
+
yum install -y bash curl git
|
4
|
+
bash < <(curl -s -B https://rvm.beginrescueend.com/install/rvm)
|
5
|
+
yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel lib
|
6
|
+
yaml-devel libffi-devel openssl-devel
|
7
|
+
source /usr/local/rvm/scripts/rvm
|
8
|
+
rvm install ree-1.8.7
|
9
|
+
rvm use ree-1.8.7 --default
|
10
|
+
|
11
|
+
gem install chef --no-ri --no-rdoc
|
12
|
+
gem install puppet --no-ri --no-rdoc
|
@@ -0,0 +1 @@
|
|
1
|
+
# This is an empty bootstrap , ready for you to customize!
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/bin/bash -ex
|
2
|
+
|
3
|
+
apt-get update
|
4
|
+
apt-get -y install libopenssl-ruby build-essential wget ssl-cert
|
5
|
+
|
6
|
+
bash < <(curl -s -B https://rvm.beginrescueend.com/install/rvm)
|
7
|
+
source /usr/local/rvm/scripts/rvm
|
8
|
+
|
9
|
+
rvm install 1.8.7
|
10
|
+
rvm use 1.8.7 --default
|
11
|
+
|
12
|
+
gem install chef --no-ri --no-rdoc
|
13
|
+
gem install puppet --no-ri --no-rdoc
|
14
|
+
|
@@ -7,5 +7,4 @@ test ! -f rubygems-1.3.7 && wget http://production.cf.rubygems.org/rubygems/ruby
|
|
7
7
|
test -f rubygems-1.3.7.tgz && tar zxf rubygems-1.3.7.tgz
|
8
8
|
cd rubygems-1.3.7 && ruby setup.rb --no-format-executable
|
9
9
|
gem install chef --no-ri --no-rdoc
|
10
|
-
gem install puppet --no-ri --no-rdoc
|
11
|
-
|
10
|
+
gem install puppet --no-ri --no-rdoc
|