mccloud 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/.gitignore +5 -0
  2. data/.rvmrc +4 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +74 -0
  5. data/README.md +123 -0
  6. data/Rakefile +5 -0
  7. data/bin/mccloud +116 -0
  8. data/lib/mccloud.rb +2 -0
  9. data/lib/mccloud/command/boot.rb +12 -0
  10. data/lib/mccloud/command/bootstrap.rb +31 -0
  11. data/lib/mccloud/command/command.rb +21 -0
  12. data/lib/mccloud/command/destroy.rb +19 -0
  13. data/lib/mccloud/command/halt.rb +19 -0
  14. data/lib/mccloud/command/init.rb +7 -0
  15. data/lib/mccloud/command/multi.rb +53 -0
  16. data/lib/mccloud/command/provision.rb +28 -0
  17. data/lib/mccloud/command/reload.rb +11 -0
  18. data/lib/mccloud/command/server.rb +30 -0
  19. data/lib/mccloud/command/ssh.rb +46 -0
  20. data/lib/mccloud/command/status.rb +31 -0
  21. data/lib/mccloud/command/suspend.rb +15 -0
  22. data/lib/mccloud/command/up.rb +65 -0
  23. data/lib/mccloud/config.rb +47 -0
  24. data/lib/mccloud/configurator/lb.rb +26 -0
  25. data/lib/mccloud/configurator/mccloud.rb +13 -0
  26. data/lib/mccloud/configurator/vm.rb +37 -0
  27. data/lib/mccloud/generators.rb +28 -0
  28. data/lib/mccloud/provisioner/chef_solo.rb +149 -0
  29. data/lib/mccloud/provisioner/puppet.rb +39 -0
  30. data/lib/mccloud/provisioner/vagrant/base.rb +63 -0
  31. data/lib/mccloud/provisioner/vagrant/chef.rb +130 -0
  32. data/lib/mccloud/provisioner/vagrant/chef_server.rb +103 -0
  33. data/lib/mccloud/provisioner/vagrant/chef_solo.rb +142 -0
  34. data/lib/mccloud/provisioner/vagrant/puppet.rb +137 -0
  35. data/lib/mccloud/provisioner/vagrant/puppet_server.rb +55 -0
  36. data/lib/mccloud/provisioner/vagrant/shell.rb +52 -0
  37. data/lib/mccloud/session.rb +199 -0
  38. data/lib/mccloud/templates/Mccloudfilet +44 -0
  39. data/lib/mccloud/type/forwarding.rb +11 -0
  40. data/lib/mccloud/type/lb.rb +34 -0
  41. data/lib/mccloud/type/vm.rb +46 -0
  42. data/lib/mccloud/util/iterator.rb +21 -0
  43. data/lib/mccloud/util/platform.rb +29 -0
  44. data/lib/mccloud/util/rsync.rb +21 -0
  45. data/lib/mccloud/util/ssh.rb +167 -0
  46. data/lib/mccloud/version.rb +3 -0
  47. data/mccloud.gemspec +37 -0
  48. data/ruby-bootstrap.sh +11 -0
  49. data/ruby-bootstrap2.sh +39 -0
  50. metadata +297 -0
@@ -0,0 +1,5 @@
1
+ Mccloudfile
2
+ .mccloud
3
+ *.pp
4
+ puppet/*
5
+ chef/*
data/.rvmrc ADDED
@@ -0,0 +1,4 @@
1
+ rvm use ruby-1.8.7
2
+ rvm gemset use mccloud
3
+ alias mccloud="bundle exec mccloud"
4
+ alias irb="bundle exec irb"
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "mccloud", :path => "."
4
+ #gem "fog", :path => "fog"
@@ -0,0 +1,74 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ mccloud (0.0.1)
5
+ cucumber (= 0.8.5)
6
+ fog
7
+ highline (~> 1.6.1)
8
+ json
9
+ net-scp
10
+ net-ssh (~> 2.1.0)
11
+ net-ssh-multi
12
+ popen4 (~> 0.1.2)
13
+ progressbar
14
+ templater
15
+ thor (~> 0.14.6)
16
+
17
+ GEM
18
+ remote: http://rubygems.org/
19
+ specs:
20
+ Platform (0.4.0)
21
+ builder (2.1.2)
22
+ cucumber (0.8.5)
23
+ builder (~> 2.1.2)
24
+ diff-lcs (~> 1.1.2)
25
+ gherkin (~> 2.1.4)
26
+ json_pure (~> 1.4.3)
27
+ term-ansicolor (~> 1.0.4)
28
+ diff-lcs (1.1.2)
29
+ excon (0.6.1)
30
+ extlib (0.9.15)
31
+ fog (0.7.2)
32
+ builder
33
+ excon (>= 0.6.1)
34
+ formatador (>= 0.1.3)
35
+ json
36
+ mime-types
37
+ net-ssh (>= 2.1.3)
38
+ nokogiri (>= 1.4.4)
39
+ ruby-hmac
40
+ formatador (0.1.3)
41
+ gherkin (2.1.5)
42
+ trollop (~> 1.16.2)
43
+ highline (1.6.1)
44
+ json (1.5.1)
45
+ json_pure (1.4.6)
46
+ mime-types (1.16)
47
+ net-scp (1.0.4)
48
+ net-ssh (>= 1.99.1)
49
+ net-ssh (2.1.4)
50
+ net-ssh-gateway (1.0.1)
51
+ net-ssh (>= 1.99.1)
52
+ net-ssh-multi (1.1)
53
+ net-ssh (>= 2.1.4)
54
+ net-ssh-gateway (>= 0.99.0)
55
+ nokogiri (1.4.4)
56
+ open4 (1.0.1)
57
+ popen4 (0.1.2)
58
+ Platform (>= 0.4.0)
59
+ open4 (>= 0.4.0)
60
+ progressbar (0.9.0)
61
+ ruby-hmac (0.4.0)
62
+ templater (1.0.0)
63
+ diff-lcs (>= 1.1.2)
64
+ extlib (>= 0.9.5)
65
+ highline (>= 1.4.0)
66
+ term-ansicolor (1.0.5)
67
+ thor (0.14.6)
68
+ trollop (1.16.2)
69
+
70
+ PLATFORMS
71
+ ruby
72
+
73
+ DEPENDENCIES
74
+ mccloud!
@@ -0,0 +1,123 @@
1
+ ## Note:
2
+ - This is a quick copy and paste job(weekend hacking), you should not consider it anything but experimental right now
3
+ - But I wanted to share the idea already with others
4
+
5
+ ## DISCLAIMER:
6
+ this is alpha sofware . Don't trust it:) And don't complain if it removes all your EC instances at once....
7
+
8
+ ## Kudos to great stuff
9
+ - [Vagrant](http://www.vagrantup.com) is great for testing machines on your local machines
10
+ - [Fog](https://github.com/geemus/fog) is a great fog library for managing cloud systems
11
+
12
+ Without those two, this project would not be possible. Kudos to the authors!
13
+
14
+ This project tries to combine both:
15
+ - Because your local machine might outgrow your complexity your local machine can handle
16
+ - use the same vagrantfile for local dev, and cloud devel
17
+
18
+ ## Some notes before you dive in
19
+
20
+ - I could probably have integrated with vagrant code but this would have taken me longer to understand vagrant code
21
+ - I didn't want the dependency on virtualbox
22
+ - The machines it creates will have the prefix as defined in the Mccloudfile, so this should not pollute your stuff
23
+
24
+ ## Todo:
25
+
26
+ - provision to other providers than ec2
27
+ - try to stay fully compatible with Vagrantfile
28
+
29
+ ## How it will work/works
30
+
31
+ ### Create a config file for fog. Note that these are spaces in front and no tabs
32
+ $ cat $HOME/.fog
33
+ <pre>
34
+ :default:
35
+ :aws_access_key_id: <your id here>
36
+ :aws_secret_access_key: <your acess key here>
37
+ </pre>
38
+
39
+ ### Create a Mccloud project
40
+ $ mccloud init
41
+
42
+ This will create a Mccloudfile
43
+
44
+ ### Edit your Mccloud appropriate
45
+
46
+ <pre>
47
+ Mccloud::Config.run do |config|
48
+ # All Mccloud configuration is done here. For a detailed explanation
49
+ # and listing of configuration options, please view the documentation
50
+ # online.
51
+
52
+ config.mccloud.prefix="mccloud"
53
+
54
+ config.vm.define :web do |web_config|
55
+ web_config.vm.ami = "ami-cef405a7"
56
+ web_config.vm.provider="AWS"
57
+
58
+ #web_config.vm.provisioner=:chef_solo
59
+ #web_config.vm.provisioner=:puppet
60
+
61
+ web_config.vm.provider_options={
62
+ # ID = "ami-cef405a7" = x64 Ubuntu 10.10
63
+ :image_id => 'ami-cef405a7',
64
+ # Flavors
65
+ :flavor_id => 't1.micro',
66
+ #:flavor_id => 'm1.large',
67
+ :groups => %w(ec2securitygroup), :key_name => "ec2-keyname",
68
+ :availability_zone => "us-east-1b"
69
+ }
70
+ web_config.vm.forward_port("http", 80, 8080)
71
+ web_config.vm.user="ubuntu"
72
+ web_config.vm.bootstrap="ruby-bootstrap.sh"
73
+ web_config.vm.key="my-ec2-key.pem"
74
+ end
75
+
76
+ ### Provisioners
77
+ config.vm.provision :puppet do |puppet|
78
+ puppet.pp_path = "/tmp/vagrant-puppet"
79
+ #puppet.manifests_path = "puppet/manifests"
80
+ #puppet.module_path = "puppet/modules"
81
+ puppet.manifest_file = "newbox.pp"
82
+ end
83
+
84
+ config.vm.provision :chef_solo do |chef|
85
+ chef.cookbooks_path = ["<your cookboopath>"]
86
+ chef.add_recipe("<some recipe>")
87
+ # You may also specify custom JSON attributes:
88
+ chef.json.merge!({})
89
+ end
90
+ end
91
+
92
+ </pre>
93
+
94
+ ### Start your machines
95
+ # If the machine does not yet exist, it will also run bootstrap
96
+ $ mccloud up web
97
+
98
+ ### Check the status
99
+ $ mccloud status
100
+
101
+ ### Bootstrap the machine
102
+ $ mccloud bootstrap web
103
+
104
+ ### (interactive) Login into the machine
105
+ $ mccloud ssh web
106
+
107
+ ### run a command on a machine
108
+ $ mccloud command web "who am i"
109
+
110
+ ### Halt the machine
111
+ $ mccloud halt web
112
+
113
+ ### Start the machine again
114
+ $ mccloud up web
115
+
116
+ ### Provision the machine
117
+ $ mccloud provision web
118
+
119
+ ### Port forwarding server
120
+ $ mccloud server
121
+
122
+ ### Destroy the machine again
123
+ $ mccloud destroy web
@@ -0,0 +1,5 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ require 'bundler/setup'
4
+ Bundler::GemHelper.install_tasks
5
+
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'thor'
5
+ require 'bundler'
6
+ require 'mccloud'
7
+
8
+ require 'mccloud/session'
9
+
10
+ class MccloudCLI < Thor
11
+
12
+ attr_accessor :all_servers
13
+ no_tasks do
14
+ def create_session
15
+ @session=Mccloud::Session.new
16
+ @session.load_config
17
+ end
18
+
19
+ end
20
+
21
+ desc "init [AMI-ID]", "initializes a box from a template"
22
+ method_options :force => :boolean
23
+ def init(amiId=nil)
24
+ end
25
+
26
+ desc "up", "bring a machine up"
27
+ method_options :force => :boolean
28
+ def up(selection=nil)
29
+ create_session
30
+ @session.up(selection,options)
31
+ end
32
+
33
+ desc "status", "show a status of all machines that are configured"
34
+ method_options :verbose => false
35
+ def status(selection=nil)
36
+ create_session
37
+ @session.status(selection,options)
38
+ end
39
+
40
+ desc "halt [NAME]", "shutdown the machine"
41
+ method_options :force => :boolean
42
+ def halt(selection=nil)
43
+ create_session
44
+ @session.halt(selection,options)
45
+ end
46
+
47
+ desc "ssh [NAME]", "spawns an ssh to the machine"
48
+ method_options :screen => :boolean
49
+ def ssh(selection=nil,command=nil)
50
+ create_session
51
+ @session.ssh(selection,command,options)
52
+ end
53
+
54
+ desc "suspend", "freeze"
55
+ method_options :force => :boolean
56
+ def suspend(selection=nil)
57
+ create_session
58
+ @session.suspend(selection,options)
59
+ end
60
+
61
+ desc "boot", "freeze"
62
+ method_options :force => :boolean
63
+ def boot(selection=nil)
64
+ create_session
65
+ @session.boot(selection,options)
66
+ end
67
+
68
+ desc "destroy [NAME]", "destroys the machine"
69
+ method_options :force => :boolean
70
+ def destroy(selection=nil)
71
+ create_session
72
+ @session.destroy(selection,options)
73
+ end
74
+
75
+ desc "reload [NAME]", "reloads the machine"
76
+ method_options :force => :boolean
77
+ def reload(selection=nil?)
78
+ create_session
79
+ @session.reload(selection,options)
80
+ end
81
+
82
+ desc "command [NAME] [COMMAND]", "exec a command on a box"
83
+ method_options :parallel => :boolean
84
+ def command(selection=nil,command="who am i")
85
+ create_session
86
+ @session.command(selection,command,options)
87
+ end
88
+
89
+ desc "bootstrap [NAME]", "exec a command on a box"
90
+ method_options :sudo => :boolean
91
+ def bootstrap(selection=nil,script="who am i")
92
+ create_session
93
+ @session.bootstrap(selection,script,options)
94
+ end
95
+
96
+ desc "multi","multi"
97
+ method_options :verbose => :boolean
98
+ def multi(selection=nil,command="who am i")
99
+ create_session
100
+ @session.multi(selection,command,options)
101
+ end
102
+
103
+ desc "provision", "provision the machine"
104
+ def provision(selection=nil)
105
+ create_session
106
+ @session.provision(selection,options)
107
+ end
108
+
109
+ desc "server", "runs a server+ forwards"
110
+ def server(selection=nil)
111
+ create_session
112
+ @session.server(selection,options)
113
+ end
114
+ end
115
+
116
+ MccloudCLI.start
@@ -0,0 +1,2 @@
1
+ require 'fog'
2
+ require 'json'
@@ -0,0 +1,12 @@
1
+ require 'mccloud/util/iterator'
2
+
3
+ module Mccloud
4
+ module Command
5
+ def boot(selection=nil,options=nil)
6
+ on_selected_machines(selection) do |id,vm|
7
+ puts "starting #{id}"
8
+ vm.instance.start
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,31 @@
1
+ require 'pp'
2
+ module Mccloud
3
+ module Command
4
+ def bootstrap(selection=nil,command="who am i",options=nil)
5
+
6
+ on_selected_machines(selection) do |id,vm|
7
+ puts "bootstrap #{selection} "
8
+ server=vm.instance
9
+ server.private_key_path=vm.key
10
+ server.username = vm.user
11
+ if server.state == "running"
12
+ puts "Uploading bootstrap code to machine #{vm.name}"
13
+ unless !File.exists?(vm.bootstrap)
14
+ server.scp(vm.bootstrap,"/tmp/bootstrap.sh")
15
+ puts "Enabling the bootstrap code to run"
16
+ result=server.ssh("chmod +x /tmp/bootstrap.sh")
17
+ else
18
+ puts "Error: bootstrap file #{vm.bootstrap} does not exist"
19
+ exit -1
20
+ end
21
+ else
22
+ puts "server is not running, so bootstrapping will do no good"
23
+ end
24
+ #instance=PROVIDER.servers.get(id)
25
+ #options={ :port => 22, :keys => [ vm.key ], :paranoid => false, :keys_only => true}
26
+ #Mccloud::Ssh.execute(instance.public_ip_address,vm.user,options,"sudo /tmp/bootstrap.sh")
27
+ end
28
+ multi(selection,"sudo /tmp/bootstrap.sh",options)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,21 @@
1
+ module Mccloud
2
+ module Command
3
+ def command(selection=nil,command="who am i")
4
+ unless options.parallel?
5
+ on_selected_machines(selection) do |id,vm|
6
+ server=PROVIDER.servers.get(id)
7
+ server.private_key_path=vm.key
8
+ server.username = vm.user
9
+ if server.state == "running"
10
+ result=server.ssh(command)
11
+ puts result[0].stdout
12
+ else
13
+ puts "not running so what's the point"
14
+ end
15
+ end
16
+ else
17
+ invoke :multi , [selection, command]
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ require 'mccloud/util/iterator'
2
+
3
+ module Mccloud
4
+ module Command
5
+ def destroy(selection=nil,options=nil)
6
+ on_selected_machines(selection) do |id,vm|
7
+ unless vm.instance.state == "shutting-down" || vm.instance.state =="terminated"
8
+ puts "Destroying #{vm.name} with id - #{id}"
9
+ vm.instance.destroy
10
+
11
+ vm.instance.wait_for { print "."; STDOUT.flush; state=="terminated"}
12
+ puts
13
+ else
14
+ puts "Server #{vm.name} - Id: #{id} has state #{vm.instance.state} so not destroying it "
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require 'mccloud/util/iterator'
2
+
3
+ module Mccloud
4
+ module Command
5
+ include Mccloud::Util
6
+ def halt(selection=nil,options=nil)
7
+ on_selected_machines(selection) do |id,vm|
8
+ unless vm.instance.state == "stopping" || vm.instance.state =="stopped"
9
+ puts "halting #{id}"
10
+ vm.instance.stop
11
+ vm.instance.wait_for { printf "."; STDOUT.flush; state=="stopped"}
12
+ puts
13
+ else
14
+ puts "#{vm.name} has state: #{server.state} so we're not halting #{vm.name} - #{id}"
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end