mccloud 0.0.13 → 0.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. data/.gitignore +13 -8
  2. data/.rvmrc +2 -0
  3. data/Gemfile +10 -1
  4. data/Guardfile +10 -0
  5. data/README.md +453 -89
  6. data/Rakefile +29 -2
  7. data/bin/mccloud +17 -116
  8. data/bin/mccloud_old +159 -0
  9. data/doc/old-README.md +81 -0
  10. data/lib/mccloud/cli.rb +55 -0
  11. data/lib/mccloud/command/balance.rb +21 -0
  12. data/lib/mccloud/command/base.rb +106 -0
  13. data/lib/mccloud/command/bootstrap.rb +12 -24
  14. data/lib/mccloud/command/define.rb +18 -0
  15. data/lib/mccloud/command/destroy.rb +12 -13
  16. data/lib/mccloud/command/forward.rb +29 -0
  17. data/lib/mccloud/command/group_base.rb +107 -0
  18. data/lib/mccloud/command/halt.rb +11 -13
  19. data/lib/mccloud/command/helpers.rb +13 -0
  20. data/lib/mccloud/command/image.rb +37 -0
  21. data/lib/mccloud/command/init.rb +8 -504
  22. data/lib/mccloud/command/init_vagrant.rb +14 -0
  23. data/lib/mccloud/command/ip.rb +32 -0
  24. data/lib/mccloud/command/ips.rb +22 -0
  25. data/lib/mccloud/command/keypair.rb +27 -0
  26. data/lib/mccloud/command/keystore.rb +29 -0
  27. data/lib/mccloud/command/lb.rb +38 -0
  28. data/lib/mccloud/command/named_base.rb +14 -0
  29. data/lib/mccloud/command/package.rb +17 -0
  30. data/lib/mccloud/command/provider.rb +30 -0
  31. data/lib/mccloud/command/provision.rb +10 -24
  32. data/lib/mccloud/command/reload.rb +12 -6
  33. data/lib/mccloud/command/sorry.rb +20 -0
  34. data/lib/mccloud/command/ssh.rb +11 -45
  35. data/lib/mccloud/command/status.rb +14 -35
  36. data/lib/mccloud/command/template.rb +16 -0
  37. data/lib/mccloud/command/undefine.rb +23 -0
  38. data/lib/mccloud/command/up.rb +8 -62
  39. data/lib/mccloud/command/version.rb +14 -0
  40. data/lib/mccloud/command/vm.rb +27 -0
  41. data/lib/mccloud/command.rb +36 -0
  42. data/lib/mccloud/config/collection.rb +107 -0
  43. data/lib/mccloud/config/component.rb +20 -0
  44. data/lib/mccloud/config/definition.rb +35 -0
  45. data/lib/mccloud/config/keypair.rb +36 -0
  46. data/lib/mccloud/config/mccloud.rb +39 -0
  47. data/lib/mccloud/config/provider.rb +55 -0
  48. data/lib/mccloud/config/template.rb +35 -0
  49. data/lib/mccloud/config.rb +128 -41
  50. data/lib/mccloud/definition.rb +104 -0
  51. data/lib/mccloud/definitions.rb +91 -0
  52. data/lib/mccloud/environment.rb +222 -0
  53. data/lib/mccloud/error.rb +20 -0
  54. data/lib/mccloud/generator.rb +49 -0
  55. data/lib/mccloud/keypair.rb +48 -0
  56. data/lib/mccloud/mccloudfile.rb +78 -0
  57. data/lib/mccloud/provider/aws/image.rb +107 -0
  58. data/lib/mccloud/provider/aws/ip/associate.rb +33 -0
  59. data/lib/mccloud/provider/aws/ip.rb +31 -0
  60. data/lib/mccloud/provider/aws/keystore.rb +21 -0
  61. data/lib/mccloud/provider/aws/lb/associate.rb +53 -0
  62. data/lib/mccloud/provider/aws/lb/sorry.rb +14 -0
  63. data/lib/mccloud/provider/aws/lb.rb +37 -0
  64. data/lib/mccloud/provider/aws/provider/image_destroy.rb +27 -0
  65. data/lib/mccloud/provider/aws/provider/image_list.rb +19 -0
  66. data/lib/mccloud/provider/aws/provider/ip_list.rb +17 -0
  67. data/lib/mccloud/provider/aws/provider/keystore_list.rb +22 -0
  68. data/lib/mccloud/provider/aws/provider/keystore_sync.rb +62 -0
  69. data/lib/mccloud/provider/aws/provider/lb_list.rb +21 -0
  70. data/lib/mccloud/provider/aws/provider/old_deregister.rb +39 -0
  71. data/lib/mccloud/provider/aws/provider/old_flavors.rb +18 -0
  72. data/lib/mccloud/provider/aws/provider/old_ips.rb +42 -0
  73. data/lib/mccloud/provider/aws/provider/old_loadbalance.rb +46 -0
  74. data/lib/mccloud/provider/aws/provider/old_package.rb +75 -0
  75. data/lib/mccloud/provider/aws/provider/old_sorry.rb +51 -0
  76. data/lib/mccloud/provider/aws/provider/old_status.rb +119 -0
  77. data/lib/mccloud/provider/aws/provider/old_validate.rb +51 -0
  78. data/lib/mccloud/provider/aws/provider/status.rb +58 -0
  79. data/lib/mccloud/provider/aws/provider.rb +219 -0
  80. data/lib/mccloud/provider/aws/stack/old_destroy.rb +43 -0
  81. data/lib/mccloud/provider/aws/stack/old_up.rb +59 -0
  82. data/lib/mccloud/provider/aws/stack/old_vm.rb +98 -0
  83. data/lib/mccloud/provider/aws/stack.rb +243 -0
  84. data/lib/mccloud/provider/aws/vm/bootstrap.rb +13 -0
  85. data/lib/mccloud/provider/aws/vm/destroy.rb +21 -0
  86. data/lib/mccloud/provider/aws/vm/forward.rb +17 -0
  87. data/lib/mccloud/provider/aws/vm/halt.rb +24 -0
  88. data/lib/mccloud/provider/aws/vm/package.rb +63 -0
  89. data/lib/mccloud/provider/aws/vm/provision.rb +25 -0
  90. data/lib/mccloud/provider/aws/vm/reload.rb +13 -0
  91. data/lib/mccloud/provider/aws/vm/resume.rb +0 -0
  92. data/lib/mccloud/provider/aws/vm/rsync.rb +11 -0
  93. data/lib/mccloud/provider/aws/vm/scp.rb +21 -0
  94. data/lib/mccloud/provider/aws/vm/ssh.rb +11 -0
  95. data/lib/mccloud/provider/aws/vm/suspend.rb +0 -0
  96. data/lib/mccloud/provider/aws/vm/up.rb +133 -0
  97. data/lib/mccloud/provider/aws/vm.rb +123 -0
  98. data/lib/mccloud/{type → provider/core}/forwarding.rb +6 -3
  99. data/lib/mccloud/provider/core/ip.rb +24 -0
  100. data/lib/mccloud/provider/core/keystore.rb +23 -0
  101. data/lib/mccloud/provider/core/lb.rb +23 -0
  102. data/lib/mccloud/provider/core/provider.rb +99 -0
  103. data/lib/mccloud/provider/core/vm/old_halt.rb +19 -0
  104. data/lib/mccloud/{generators.rb → provider/core/vm/old_init.rb} +0 -0
  105. data/lib/mccloud/provider/core/vm/old_multi.rb +60 -0
  106. data/lib/mccloud/provider/core/vm/old_reload.rb +11 -0
  107. data/lib/mccloud/{command/server.rb → provider/core/vm/old_server.rb} +2 -2
  108. data/lib/mccloud/provider/core/vm/old_ssh_command.rb +21 -0
  109. data/lib/mccloud/{command/suspend.rb → provider/core/vm/old_suspend.rb} +2 -2
  110. data/lib/mccloud/provider/core/vm/old_wizard.rb +511 -0
  111. data/lib/mccloud/provider/core/vm/rsync.rb +67 -0
  112. data/lib/mccloud/provider/core/vm/ssh.rb +137 -0
  113. data/lib/mccloud/provider/core/vm/ssh_bootstrap.rb +62 -0
  114. data/lib/mccloud/provider/core/vm/ssh_forward.rb +47 -0
  115. data/lib/mccloud/provider/core/vm.rb +121 -0
  116. data/lib/mccloud/provider/fog/fogconfig.rb +44 -0
  117. data/lib/mccloud/provider/fog/provider.rb +46 -0
  118. data/lib/mccloud/provider/host/provider/status.rb +12 -0
  119. data/lib/mccloud/provider/host/provider.rb +85 -0
  120. data/lib/mccloud/provider/host/vm/bootstrap.rb +11 -0
  121. data/lib/mccloud/provider/host/vm/forward.rb +12 -0
  122. data/lib/mccloud/provider/host/vm/provision.rb +19 -0
  123. data/lib/mccloud/provider/host/vm/scp.rb +35 -0
  124. data/lib/mccloud/provider/host/vm/ssh.rb +11 -0
  125. data/lib/mccloud/provider/host/vm.rb +28 -0
  126. data/lib/mccloud/provider/libvirt/provider/status.rb +43 -0
  127. data/lib/mccloud/provider/libvirt/provider.rb +96 -0
  128. data/lib/mccloud/provider/libvirt/vm/bootstrap.rb +17 -0
  129. data/lib/mccloud/provider/libvirt/vm/destroy.rb +33 -0
  130. data/lib/mccloud/provider/libvirt/vm/forward.rb +12 -0
  131. data/lib/mccloud/provider/libvirt/vm/halt.rb +20 -0
  132. data/lib/mccloud/provider/libvirt/vm/provision.rb +25 -0
  133. data/lib/mccloud/provider/libvirt/vm/reload.rb +13 -0
  134. data/lib/mccloud/provider/libvirt/vm/rsync.rb +11 -0
  135. data/lib/mccloud/provider/libvirt/vm/scp.rb +15 -0
  136. data/lib/mccloud/provider/libvirt/vm/ssh.rb +11 -0
  137. data/lib/mccloud/provider/libvirt/vm/up.rb +65 -0
  138. data/lib/mccloud/provider/libvirt/vm.rb +67 -0
  139. data/lib/mccloud/provider/script/provider/status.rb +12 -0
  140. data/lib/mccloud/provider/script/provider.rb +125 -0
  141. data/lib/mccloud/provider/script/vm.rb +13 -0
  142. data/lib/mccloud/provider/vagrant/provider/status.rb +14 -0
  143. data/lib/mccloud/provider/vagrant/provider.rb +135 -0
  144. data/lib/mccloud/provider/vagrant/vm/destroy.rb +11 -0
  145. data/lib/mccloud/provider/vagrant/vm/forward.rb +12 -0
  146. data/lib/mccloud/provider/vagrant/vm/halt.rb +11 -0
  147. data/lib/mccloud/provider/vagrant/vm/provision.rb +11 -0
  148. data/lib/mccloud/provider/vagrant/vm/reload.rb +11 -0
  149. data/lib/mccloud/provider/vagrant/vm/resume.rb +11 -0
  150. data/lib/mccloud/provider/vagrant/vm/ssh.rb +11 -0
  151. data/lib/mccloud/provider/vagrant/vm/suspend.rb +11 -0
  152. data/lib/mccloud/provider/vagrant/vm/up.rb +11 -0
  153. data/lib/mccloud/provider/vagrant/vm.rb +46 -0
  154. data/lib/mccloud/provider/vmfusion/provider/status.rb +24 -0
  155. data/lib/mccloud/provider/vmfusion/provider.rb +98 -0
  156. data/lib/mccloud/provider/vmfusion/vm/forward.rb +12 -0
  157. data/lib/mccloud/provider/vmfusion/vm/halt.rb +11 -0
  158. data/lib/mccloud/provider/vmfusion/vm/resume.rb +11 -0
  159. data/lib/mccloud/provider/vmfusion/vm/suspend.rb +11 -0
  160. data/lib/mccloud/provider/vmfusion/vm/up.rb +11 -0
  161. data/lib/mccloud/provider/vmfusion/vm.rb +47 -0
  162. data/lib/mccloud/provisioner/chef_solo.rb +193 -79
  163. data/lib/mccloud/provisioner/puppet.rb +205 -32
  164. data/lib/mccloud/provisioner/shell.rb +48 -0
  165. data/lib/mccloud/template.rb +74 -0
  166. data/lib/mccloud/templates/Mccloudfile.erb +212 -39
  167. data/lib/mccloud/templates/{bootstrap-centos-rubysource-1.8.7.sh → bootstrap/bootstrap-centos-rubysource-1.8.7.sh} +0 -0
  168. data/lib/mccloud/templates/{bootstrap-centos-rvm-1.8.7.sh → bootstrap/bootstrap-centos-rvm-1.8.7.sh} +0 -0
  169. data/lib/mccloud/templates/{bootstrap-centos-rvm-1.9.2.sh → bootstrap/bootstrap-centos-rvm-1.9.2.sh} +0 -0
  170. data/lib/mccloud/templates/{bootstrap-centos-rvm-ree-1.8.7.sh → bootstrap/bootstrap-centos-rvm-ree-1.8.7.sh} +0 -0
  171. data/lib/mccloud/templates/bootstrap/bootstrap-chef-omnibus.sh +8 -0
  172. data/lib/mccloud/templates/{bootstrap-custom.sh → bootstrap/bootstrap-custom.sh} +0 -0
  173. data/lib/mccloud/templates/{bootstrap-ubuntu-rvm-1.8.7.sh → bootstrap/bootstrap-ubuntu-rvm-1.8.7.sh} +0 -0
  174. data/lib/mccloud/templates/{bootstrap-ubuntu-system.sh → bootstrap/bootstrap-ubuntu-system.sh} +0 -0
  175. data/lib/mccloud/templates/locales/en.yml +30 -0
  176. data/lib/mccloud/templates/vm.erb +9 -0
  177. data/lib/mccloud/templates.rb +35 -0
  178. data/lib/mccloud/ui.rb +82 -0
  179. data/lib/mccloud/util/rostruct.rb +24 -0
  180. data/lib/mccloud/util/rsync.rb +12 -8
  181. data/lib/mccloud/util/ssh.rb +18 -12
  182. data/lib/mccloud/util/sshkey.rb +3 -2
  183. data/lib/mccloud/version.rb +4 -1
  184. data/lib/mccloud/vm.rb +62 -0
  185. data/lib/mccloud/vms.rb +60 -0
  186. data/lib/mccloud.rb +24 -1
  187. data/mccloud.gemspec +12 -3
  188. data/samples/Mccloudfile +117 -0
  189. data/samples/bitnami_drupal_cloud.json +102 -0
  190. data/samples/bootstrap-ubuntu-system.sh +16 -0
  191. data/samples/mcollective_cloud.json +198 -0
  192. data/samples/stack_cloud.json +93 -0
  193. data/samples/stacks.txt +5 -0
  194. data/spec/commands/define_spec.rb +96 -0
  195. data/spec/commands/init_spec.rb +30 -0
  196. data/spec/environment/environment_spec.rb +26 -0
  197. data/spec/generator_spec.rb +30 -0
  198. data/spec/keypair_spec.rb +38 -0
  199. data/spec/provider/aws/credentials_spec.rb +37 -0
  200. data/spec/provisioner/puppet/Mccloud-puppet-test +32 -0
  201. data/spec/provisioner/puppet/puppet_spec.rb +110 -0
  202. data/spec/spec_helper.rb +0 -0
  203. data/templates/ubuntu-10.10-server-amd64/aws.json +3 -0
  204. data/templates/ubuntu-10.10-server-amd64/bootstrap.sh +16 -0
  205. data/templates/ubuntu-10.10-server-amd64/definition.old +51 -0
  206. data/templates/ubuntu-10.10-server-amd64/mccloud.erb +6 -0
  207. metadata +293 -67
  208. data/Gemfile.lock +0 -53
  209. data/lib/mccloud/command/boot.rb +0 -12
  210. data/lib/mccloud/command/command.rb +0 -21
  211. data/lib/mccloud/command/multi.rb +0 -60
  212. data/lib/mccloud/configurator/lb.rb +0 -26
  213. data/lib/mccloud/configurator/mccloud.rb +0 -33
  214. data/lib/mccloud/configurator/vm.rb +0 -37
  215. data/lib/mccloud/provisioner/vagrant/base.rb +0 -63
  216. data/lib/mccloud/provisioner/vagrant/chef.rb +0 -130
  217. data/lib/mccloud/provisioner/vagrant/chef_server.rb +0 -103
  218. data/lib/mccloud/provisioner/vagrant/chef_solo.rb +0 -142
  219. data/lib/mccloud/provisioner/vagrant/puppet.rb +0 -137
  220. data/lib/mccloud/provisioner/vagrant/puppet_server.rb +0 -55
  221. data/lib/mccloud/provisioner/vagrant/shell.rb +0 -52
  222. data/lib/mccloud/session.rb +0 -206
  223. data/lib/mccloud/type/lb.rb +0 -34
  224. data/lib/mccloud/type/vm.rb +0 -47
  225. data/lib/mccloud/util/iterator.rb +0 -20
data/.gitignore CHANGED
@@ -1,9 +1,14 @@
1
- /Mccloudfile
2
- /.mccloud
3
- /*.pp
4
- /puppet/*
5
- /chef/*
6
- /.fog
7
- /bootstrap*
8
- Mccloudfile.*
1
+ Mccloudfile*
2
+ .mccloud
3
+ puppet/*
4
+ manifests/*
5
+ vms/*
6
+ definitions/*
7
+ /^modules/
8
+ ^chef/*
9
+ .fog
10
+ /^bootstrap*/
9
11
  pkg/*
12
+ *.swp
13
+ Gemfile.lock
14
+ .DS_Store
data/.rvmrc CHANGED
@@ -1,4 +1,6 @@
1
1
  rvm use ruby-1.8.7
2
+ #rvm use ruby-1.9.2
2
3
  rvm gemset use mccloud
3
4
  alias mccloud="bundle exec mccloud"
4
5
  alias irb="bundle exec irb"
6
+ alias rake="bundle exec rake"
data/Gemfile CHANGED
@@ -1,4 +1,13 @@
1
1
  source "http://rubygems.org"
2
2
 
3
+ #gem 'fog', :path => "/Users/patrick/imac/fog"
4
+ #gem "fog", :git => 'git@github.com:geemus/fog.git',:branch => 'master'
5
+
6
+ #http://www.deploymentzone.com/2011/05/24/guard-rspec-2-and-growl/
7
+ group :development do
8
+ gem 'rspec', '>= 2.0'
9
+ gem "rake"
10
+ gem 'parallel_tests'
11
+ end
12
+
3
13
  gem "mccloud", :path => "."
4
- #gem "fog", :path => "fog"
data/Guardfile ADDED
@@ -0,0 +1,10 @@
1
+ guard :rspec, :version => 2, :cli => "--color --format documentation" do
2
+ watch(%r{spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { "spec" }
4
+ #watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
5
+ watch(%r{spec/spec_helper\.rb$}) { "spec" }
6
+ end
7
+
8
+ guard :cucumber, :cli => "-s" do
9
+ watch(%r{lib/(.+)\.rb$}) { "features" }
10
+ end
data/README.md CHANGED
@@ -1,123 +1,487 @@
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
1
+ # Note: documentation is currently in flux
4
2
 
5
- ## DISCLAIMER:
6
- this is alpha sofware . Don't trust it:) And don't complain if it removes all your EC instances at once....
3
+ # About
4
+ ## What the hell is mccloud?
5
+
6
+ Over the years I fell in love with [Vagrant](http://vagrantup.com) and wanted to have the same workflow for ec2, kvm, internal clouds etc..
7
+
8
+ Therefore Mccloud aims to be the equivalent of ``vagrant`` but extending it to use providers:
9
+ - aws/ec2
10
+ - kvm
11
+ - simple scripts
12
+ - and of course vagrant itself.
13
+
14
+ I'm aware vagrant might extend it's providers in the future; still as they are currently not yet implemented I thought I'd share this code with you.
15
+ As new provider will become available in vagrant they will also be available in mccloud through the vagrant provider
7
16
 
8
17
  ## Kudos to great stuff
18
+ Without the following opensource software this would not be that awesome!
19
+
9
20
  - [Vagrant](http://www.vagrantup.com) is great for testing machines on your local machines
10
21
  - [Fog](https://github.com/geemus/fog) is a great fog library for managing cloud systems
22
+ - [Fission](https://github.com/thbishop/fission) is a gem to interact with vmware fusion machines
23
+
24
+ Kudos to the authors!
25
+
26
+ ## Why not in vagrant?
27
+
28
+ NOTE: mccloud is meant to be complementary to vagrant - we truely love @mitchellh
29
+
30
+ - Main reason - this code has been around way before there was discussion on vagrant new providers
31
+ - Companies are using it now as it supports EC2, KVM, scripts, NOW
32
+ - Vagrant is (currently) focused on desktop vm types only - this extends it to server based cloud solution
33
+ - Once providers are available in vagrant, you can easily switch: the effort is not in the Mccloudfile or Vagrantfile syntax but in the provisioning
34
+ - Vagrant moves away from the 'gem ' support and targets fat installers - I need this code available as a library
35
+ - Vagrant new setup requires root to be installed - not what I want
36
+ - Vagrant builder (might) replace veewee with new setup - I want to continue working with it now
37
+
38
+ Bottom line - if vagrant has the new plugin architecture going and documented I'm happy to review again
39
+
40
+
41
+ # Installation
42
+ ## Requirements
43
+
44
+ - You currently need ruby installed. Either use the system ruby or install [rvm](https://rvm.io/)
45
+ - libxml, libxslt and nokogiri
46
+
47
+ ## Using the stable gem
48
+
49
+ $ gem install mccloud
50
+
51
+ ## Using the cutting edge github code
52
+
53
+ $ git clone git@github.com:jedi4ever/mccloud.git
54
+ $ cd mccloud
55
+ # Note when you use rvm , there is an .rvmrc that will set some aliases
56
+ $ bundle install
57
+ $ bundle exec mccloud
58
+
59
+ # Configuration
60
+ Similar to a Vagrantfile, mccloud has a Mccloudfile where all is configured.
61
+ TODO: there is currently no ``mccloud init`` as it's hard to guess your preferred options
62
+
63
+ ## Mccloudfile Skeleton
64
+ A mccloudfile is actually a ruby code file with a specific block
65
+
66
+ Mccloud::Config.run do |config|
67
+ end
68
+
69
+ ## Provider section
70
+ As mccloud supports multiple providers , the first part you need to do it define the providers you want to use
71
+
72
+ ### Provider AWS
73
+
74
+ You can use this provider to create/manage ec2 instances.
75
+
76
+ As this relies on fog, you first have to create a fog configuration file
77
+
78
+ $ cat $HOME/.fog
79
+ :default:
80
+ :aws_access_key_id: <your id here>
81
+ :aws_secret_access_key: <your acess key here>
82
+
83
+ The syntax to use for an ec2
84
+
85
+ Mccloud::Config.run do |config|
86
+
87
+ # Define a :aws provider 'aws-us-east'
88
+ config.provider.define "host-provider" do |provider_config|
89
+
90
+ #Note: this are option provided to fog for creation
91
+ provider_config.provider.options = { }
92
+
93
+ # Region in which to create the VM
94
+ provider_config.provider.region = "us-east-1"
95
+
96
+ ## Check if necessary keypairs exist
97
+ ## To speed things up, set it to false
98
+ provider_config.provider.check_keypairs = false
99
+
100
+ ## Disable check if required security groups exist
101
+ ## To speed things up, set it to false
102
+ provider_config.provider.check_security_groups = false
103
+
104
+ ## If you share an amazon account with multiple people
105
+ ## You can use namespaces to separate resources
106
+ ## All resources will take this prefix
107
+ provider_config.provider.namespace = ""
108
+
109
+ ## Fog credential pair to use in .fog file
110
+ provider_config.provider.credential = :default
111
+
112
+ end
113
+ end
114
+
115
+ If using the aws/ec see also the section about defining keystores and keypairs
116
+
117
+ ### Provider host
118
+ Useful with machines that are only ssh-able and where you don't have create options
119
+
120
+ Mccloud::Config.run do |config|
121
+
122
+ # Define a :host provider 'host-provider' that is ssh-able
123
+ config.provider.define "host-provider" do |provider_config|
124
+ provider_config.provider.flavor = :host
125
+ end
126
+
127
+ end
128
+
129
+ ### Provider vagrant
130
+ Have mccloud pick up your ``Vagrantfile``
131
+
132
+ Mccloud::Config.run do |config|
133
+
134
+ # Define a :vagrant provider 'vagrant-provider'
135
+ config.provider.define "vagrant-provider" do |provider_config|
136
+ provider_config.provider.flavor = :vagrant
137
+ end
138
+ end
139
+
140
+ ### Provider script
141
+ Usefull if your cloud doesn't have an ip, but you can create start,stop, etc... scripts to do the work
142
+
143
+ Mccloud::Config.run do |config|
144
+
145
+ datacenter_settings = {
146
+ :DATACENTER => 'belgium',
147
+ :ENVIRONMENT => 'test'
148
+ }
149
+
150
+ # Define a :script provider 'script-provider'
151
+ config.provider.define "script-provider" do |provider_config|
152
+ provider_config.provider.flavor = :script
153
+
154
+
155
+ # environment variables to pass to the scripts
156
+ # these are passed as MCCLOUD_<varname>
157
+ provider_config.provider.variables = datacenter_settings
158
+
159
+ # No need for a namespace
160
+ provider_config.provider.namespace = ""
161
+
162
+ # location of the start, stop etc.. scripts
163
+ provider_config.provider.script_dir = "myscript-provider"
164
+ end
165
+
166
+ end
167
+
168
+ ### Provider kvm
169
+
170
+ this works together with veewee that support creating kvm template machines.
171
+ Like on vagrant, mccloud clones a veewee created vm
172
+
173
+ config.provider.define "kvm-libvirt" do |config|
174
+ config.provider.type=:libvirt
175
+ config.provider.options={ :libvirt_uri => "qemu+ssh://ubuntu@kvmbox/system" }
176
+ config.provider.namespace="test"
177
+ end
178
+
179
+ ## Keypair section
180
+
181
+ Currently only used by aws provider. Allows you to define a re-usable name for keypairs for each aws region
182
+
183
+ config.keypair.define "mccloud" do |key_config|
184
+ key_config.keypair.public_key_path = "#{File.join(ENV['HOME'],'.ssh','mccloud_rsa.pub')}"
185
+ key_config.keypair.private_key_path = "#{File.join(ENV['HOME'],'.ssh','mccloud_rsa')}"
186
+ end
187
+
188
+
189
+ ## Keystore section
190
+
191
+ Currently only used by aws provider. Allows you to define multiple keystores for your aws keys
192
+
193
+ config.keystore.define "aws-us-east-key-store" do |keystore_config|
194
+ keystore_config.keystore.provider = "aws-us-east"
195
+ keystore_config.keystore.keypairs = [
196
+ # :name is the name as it will be displayed on amazon
197
+ # :keypair is the named as defined in the mccloudfile
198
+ { :name => "mccloud", :keypair => "mccloud"},
199
+ ]
200
+ end
201
+
202
+ ## IP definitions
203
+
204
+ config.ip.define "ip-demo1" do |config|
205
+ config.ip.provider="aws-eu-west"
206
+ config.ip.address="46.137.72.170"
207
+ config.ip.vmname = "aws-demo1"
208
+ end
209
+
210
+ ## LB definitions
211
+
212
+ config.lb.define "mccloud-development-patrick-lb" do |config|
213
+ config.lb.provider="aws-eu-west"
214
+ config.lb.members=["aws-demo2","aws-demo1"]
215
+ config.lb.sorry_members=["aws-demo2"]
216
+ end
217
+
218
+ ## Template/definitions
219
+ TODO
220
+
221
+ ## VM definitions
222
+ ### Core vm
223
+
224
+ Sharing of files is done over rsync because cloud based architectures don't have the ability to mount local folders
225
+
226
+ vm_config.vm.share_folder("somename", "/source/inthemachinepath", "localmachinepath")
227
+
228
+ vm_config.vm.bootstrap = "somescript"
229
+ vm_config.vm.bootstrap_user = "root"
230
+ vm_config.vm.bootstrap_password = "blabla"
231
+ vm_config.vm.user = "ubuntu"
232
+
233
+ vm_config.vm.name
234
+ vm_config.vm.port
235
+
236
+ vm_config.vm.private_key_path
237
+ vm_config.vm.public_key_path
238
+ vm_config.vm.agent_forwarding
239
+ vm_config.vm.autoselection
240
+ vm_config.vm.bootstrap
241
+ vm_config.vm.bootstrap_user
242
+ vm_config.vm.bootstrap_password
243
+
244
+ vm_config.vm.forward_port
245
+
246
+ ### AWS vm
247
+
248
+ vm.ami
249
+ vm.key_name
250
+ vm.security_groups = Array
251
+ vm.user_data
252
+ vm.flavor
253
+ vm.user
254
+
255
+ config.vm.define "demo" do |config|
256
+ config.vm.provider="aws-eu-west"
257
+ config.vm.ami="ami-e59ca991"
258
+ config.vm.flavor="t1.micro"
259
+ config.vm.zone="eu-west-1a"
260
+ config.vm.user="ubuntu"
261
+ config.vm.security_groups=["thesecuritygroup"]
262
+ config.vm.key_name="mccloud-key-patrick"
263
+ config.vm.bootstrap="definitions/ubuntu/bootstrap-ubuntu-system.sh"
264
+ config.vm.private_key_path="keys/mccloud_rsa"
265
+ config.vm.public_key_path="keys/mccloud_rsa.pub"
266
+ end
267
+
268
+
269
+ this is the way we are currently mounting EBS Volumes with Mccloud.
270
+ For attaching an EBS volume created from a Snaphot;
271
+
272
+ # see http://fog.io/1.1.2/rdoc/Fog/Compute/AWS/Servers.html
273
+ # and https://github.com/fog/fog/blob/v1.1.2/lib/fog/aws/requests/compute/run_instances.rb
274
+ config.vm.create_options = {
275
+ :block_device_mapping => [
276
+ { "DeviceName" => "/dev/sdf", "Ebs.SnapshotId" =>
277
+ "snap-d056d786", "Ebs.DeleteOnTermination" => true }
278
+ ]
279
+ }
280
+
281
+ Or, for attaching a newly created EBS volume:
282
+
283
+ config.vm.create_options = {
284
+ :block_device_mapping => [
285
+ { "DeviceName" => "/dev/sdf", "Ebs.VolumeSize" => "100",
286
+ "Ebs.DeleteOnTermination" => false }
287
+ ]
288
+ }
289
+
290
+ The mounting we then do our provision.sh script:
291
+
292
+ echo "/dev/sdf1 /mnt/ebs ext4 defaults 0 0" >> /etc/fstab
293
+ mkdir -p /mnt/ebs
294
+ mount -a
295
+
296
+
297
+ ### Fog vm
298
+
299
+ ### Vagrant vm
300
+
301
+ config.vm.define "compute1" do |vm_config|
302
+ vm_config.vm.provider = "vagrant"
303
+ end
304
+
305
+ ### Host vm
306
+
307
+ config.vm.define "mycoolhost.com" do |config|
308
+ config.vm.provider=:hosts
309
+ config.vm.ip_address="mycoolhost.com"
310
+ config.vm.user="ubuntu"
311
+ config.vm.port = "2222"
312
+ config.vm.bootstrap = "bootstrap/centos-603"
313
+ config.vm.agent_forwarding = true
314
+ end
315
+
316
+ ### KVM vm
317
+
318
+ config.vm.define "backend" do |config|
319
+ config.vm.provider="juno-libvirt"
320
+
321
+ config.vm.create_options={
322
+ :network_interface_type => "bridge",
323
+ :volume_template_name => "test-baseimage.img",
324
+ :cpus => "3",
325
+ :memory_size => 2*1024*1024, #2 GB
326
+ }
327
+ config.vm.user="ubuntu"
328
+ config.vm.bootstrap="definitions/ubuntu/bootstrap-ubuntu-system.sh"
329
+ config.vm.private_key_path="keys/mccloud_rsa"
330
+ config.vm.public_key_path="keys/mccloud_rsa.pub"
331
+ end
332
+
333
+
334
+ ### Vmfusion
335
+
336
+ ## Provisioners
337
+
338
+ You can use multiple provisioners per vm
339
+
340
+
341
+ ### Puppet apply provisioner
342
+
343
+ manifest_file
344
+ manifest_path
345
+ module_paths = Array
346
+ pp_path
347
+ options
348
+
349
+ vm_config.vm.provision :puppet do |puppet|
350
+ puppet_flags = "--verbose --show_diff"
351
+ puppet.manifest_file = "site.pp"
352
+ puppet.pp_path = "/var/tmp/puppet"
353
+ puppet.manifests_path = "puppet/manifests"
354
+ puppet.module_path = [ "puppet/modules" ,"puppet/my-modules"]
355
+ puppet.options = puppet_flags
356
+ end
357
+
358
+ ### Chef-solo provisioner
359
+
360
+ cookbooks_path
361
+ roles_path
362
+ provisioning_path
363
+ data_bags_path
364
+ json
365
+ json_erb
366
+ clean_after_run
367
+ roles
368
+
369
+ mccloud server is added to json
11
370
 
12
- Without those two, this project would not be possible. Kudos to the authors!
371
+ add_role(name)
372
+ add_recipe(name)
13
373
 
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
374
+ # Read chef solo nodes files
375
+ require 'chef'
376
+ nodes = []
377
+ Dir["data_bags/node/*.json"].each do |n|
378
+ nodes << JSON.parse(IO.read(n))
379
+ end
17
380
 
18
- ## Some notes before you dive in
381
+ nodes.each do |n|
382
+ config.vm.define n.name do |vm_config|
383
+ vm_config.vm.provider = "host"
384
+ vm_config.vm.ip_address = n.automatic_attrs[:ipaddress]
385
+ vm_config.vm.user = n.automatic_attrs[:sudo_user]
19
386
 
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
387
+ vm_config.vm.bootstrap = File.join("bootstrap","bootstrap-#{n.automatic_attrs[:platform]}.sh")
388
+ vm_config.vm.bootstrap_user = n.automatic_attrs[:bootstrap_user]
389
+ vm_config.vm.bootstrap_password = n.automatic_attrs[:bootstrap_password]
23
390
 
24
- ## Todo:
391
+ vm_config.vm.provision :chef_solo do |chef|
392
+ chef.cookbooks_path = [ "cookbooks", "site-cookbooks" ]
393
+ chef.roles_path = "roles"
394
+ chef.data_bags_path = "data_bags"
395
+ chef.clean_after_run = false
25
396
 
26
- - provision to other providers than ec2
27
- - try to stay fully compatible with Vagrantfile
397
+ chef.json.merge!(n.default_attrs)
398
+ chef.json.merge!(n.automatic_attrs)
399
+ chef.json.merge!(n.override_attrs)
28
400
 
29
- ## How it will work/works
401
+ chef.add_role n.chef_environment
402
+ chef.add_role n.automatic_attrs[:platform]
30
403
 
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>
404
+ n.run_list.run_list_items.each do |r|
405
+ chef.add_role r.name if r.type == :role
406
+ chef.add_recipe r.name if r.type == :recipe
407
+ end
408
+ end #end provisioner
38
409
 
39
- ### Create a Mccloud project
40
- $ mccloud init
410
+ end #end vm define
411
+ end # nodes.each
41
412
 
42
- This will create a Mccloudfile
43
413
 
44
- ### Edit your Mccloud appropriate
414
+ # Using ips in erb json
415
+ chef.json.merge!({
416
+ :logger => {
417
+ :redis_host_ip => "<%= private_ips['frontend'] %>"
418
+ }
419
+ })
45
420
 
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.
421
+ # Defining a default node
422
+ def default_node(chef)
423
+ chef.add_recipe("ntp")
424
+ chef.add_recipe("timezone")
425
+ chef.json.merge!({
426
+ :nagios_host_ip => "<%= private_ips['monitoring'] %>",
427
+ :ruby => {
428
+ :version => "1.9.2",
429
+ :patch_level => "p180"}}
430
+ })
431
+ end
51
432
 
52
- config.mccloud.prefix="mccloud"
433
+ ### Shell provisioner
53
434
 
54
- config.vm.define :web do |web_config|
55
- web_config.vm.ami = "ami-cef405a7"
56
- web_config.vm.provider="AWS"
435
+ option command.sudo = true|false
57
436
 
58
- #web_config.vm.provisioner=:chef_solo
59
- #web_config.vm.provisioner=:puppet
437
+ config.vm.provision :shell do |command|
438
+ command.inline="uptime"
439
+ end
60
440
 
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
441
+ config.vm.provision :shell do |command|
442
+ command.path="script.sh"
443
+ end
75
444
 
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
445
+ ## Usage
83
446
 
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
447
+ Some functions are there in the CLI, but they are left overs from previous coding sessions.
91
448
 
92
- </pre>
449
+ ### Mostly working
450
+ Tasks:
93
451
 
94
- ### Start your machines
95
- # If the machine does not yet exist, it will also run bootstrap
96
- $ mccloud up web
452
+ mccloud version # Prints the Mccloud version information
97
453
 
98
- ### Check the status
99
- $ mccloud status
454
+ mccloud bootstrap [NAME] [FILENAME] # Executes the bootstrap sequence
455
+ mccloud destroy [NAME] # Destroys the machine
456
+ mccloud forward [NAME] # Forwards ports from a machine to localhost
457
+ mccloud halt [NAME] # Shutdown the machine
458
+ mccloud help [TASK] # Describe available tasks or one specific task
459
+ mccloud image # Subcommand to manage images
460
+ mccloud up [NAME] # Starts the machine and provisions it
461
+ mccloud provision [NAME] # Provisions the machine
462
+ mccloud reload [NAME] # Reboots the machine
463
+ mccloud ssh [NAME] [COMMAND] # Ssh-shes into the box
464
+ mccloud status [name] # Shows the status of the current Mccloud environment
100
465
 
101
- ### Bootstrap the machine
102
- $ mccloud bootstrap web
466
+ mccloud lb # Subcommand to manage Loadbalancers
467
+ mccloud balance [LB-NAME] # Balances loadbalancers
468
+ mccloud sorry [LB-NAME] # Puts loadbalancers in a sorry state
103
469
 
104
- ### (interactive) Login into the machine
105
- $ mccloud ssh web
470
+ mccloud ip # Subcommand to manage IP's
471
+ mccloud ips [NAME] # Associate IP addresses
106
472
 
107
- ### run a command on a machine
108
- $ mccloud command web "who am i"
473
+ ### Experimental/Not checked
109
474
 
110
- ### Halt the machine
111
- $ mccloud halt web
475
+ mccloud define NAME TEMPLATE-NAME # Creates a new definition based on a tempate
476
+ mccloud init # Initializes a new Mccloud project
112
477
 
113
- ### Start the machine again
114
- $ mccloud up web
478
+ mccloud keypair # Subcommand to manage keypairs
479
+ mccloud keystore # Subcommand to manage keystores
115
480
 
116
- ### Provision the machine
117
- $ mccloud provision web
481
+ mccloud package [NAME] # Packages the machine
482
+ mccloud template # Subcommand to manage templates
483
+ mccloud vm # Subcommand to manage vms
118
484
 
119
- ### Port forwarding server
120
- $ mccloud server
121
485
 
122
- ### Destroy the machine again
123
- $ mccloud destroy web
486
+ # DISCLAIMER:
487
+ this is eternal beta sofware . Don't trust it:) And don't complain if it removes all your EC instances at once....
data/Rakefile CHANGED
@@ -1,5 +1,32 @@
1
- require 'rubygems'
2
- require 'bundler'
3
1
  require 'bundler/setup'
4
2
  Bundler::GemHelper.install_tasks
5
3
 
4
+ #desc 'Default: run tests'
5
+ #task :default => :test
6
+
7
+ require 'rake'
8
+ require 'rspec/core/rake_task'
9
+ require 'rake/testtask'
10
+
11
+
12
+ desc 'Tests not requiring an real box'
13
+ Rake::TestTask.new do |t|
14
+ t.libs << "test"
15
+ t.pattern = 'test/**/*_test.rb'
16
+ end
17
+
18
+ desc 'Tests requiring an real providers'
19
+ Rake::TestTask.new do |t|
20
+ t.name="realtest"
21
+ t.libs << "test"
22
+ t.pattern = 'test/**/*_realtest.rb'
23
+ end
24
+
25
+
26
+ desc 'Specs'
27
+ RSpec::Core::RakeTask.new(:spec) do |t|
28
+ t.pattern = './spec/**/*_spec.rb' # don't need this, it's default
29
+ t.verbose = true
30
+ #t.rspec_opts = "--format documentation --color"
31
+ # Put spec opts in a file named .rspec in root
32
+ end