mccloud 0.0.13 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,13 +1,30 @@
1
- require 'mccloud/util/rsync'
2
- require 'mccloud/util/ssh'
1
+ require 'erb'
2
+ require 'ostruct'
3
+ require 'tempfile'
4
+
5
+
3
6
  module Mccloud
4
7
  module Provisioner
8
+ class ErbBinding < OpenStruct
9
+ def get_binding
10
+ return binding()
11
+ end
12
+ end
13
+
5
14
  class ChefSolo
6
- attr_accessor :cookbooks_path
7
- attr_accessor :role_path
15
+
16
+ attr_reader :name
17
+ attr_reader :env
18
+
19
+ attr_accessor :cookbooks_path
20
+ attr_accessor :roles_path
8
21
  attr_accessor :provisioning_path
22
+ attr_accessor :data_bags_path
9
23
  attr_accessor :json
24
+ attr_accessor :json_erb
25
+ attr_accessor :clean_after_run
10
26
  attr_reader :roles
27
+
11
28
  attr_accessor :node_name
12
29
  attr_accessor :log_level
13
30
  attr_accessor :http_proxy
@@ -18,37 +35,133 @@ module Mccloud
18
35
  attr_accessor :https_proxy_pass
19
36
  attr_accessor :no_proxy
20
37
 
21
- def initialize
38
+ def initialize(env)
39
+ @env=env
22
40
  @provisioning_path="/tmp/mccloud-chef"
23
41
  @json={ :instance_role => "mccloud"}
42
+ @json_erb=true
43
+ @name ="chef_solo"
44
+ @log_level="info"
45
+ @cookbooks_path = []
46
+ @clean_after_run = true
24
47
  end
25
-
26
- def run(vm)
27
- puts "we ran mylord"
28
- json=@json.to_json
29
- puts json
48
+
49
+ def mccloudconfig_to_json
50
+ end
51
+
52
+ def run(server)
53
+ if @json_erb
54
+ # http://stackoverflow.com/questions/1338960/ruby-templates-how-to-pass-variables-into-inlined-erb
55
+
56
+ public_ips=Hash.new
57
+ private_ips=Hash.new
58
+ server.provider.vms.each do |name,vm|
59
+ public_ips[name]=vm.public_ip_address
60
+ private_ips[name]=vm.private_ip_address
61
+ end
62
+
63
+ # http://www.techques.com/question/1-3242470/Problem-using-OpenStruct-with-ERB
64
+ # We only want specific variables for ERB
65
+ data = { :public_ips => public_ips, :private_ips => private_ips}
66
+
67
+ vars = ErbBinding.new(data)
68
+
69
+ # Added vmname in mccloud
70
+ @json.merge!({ :mccloud => {:name => server.name }})
71
+
72
+ template = @json.to_json.to_s
73
+ erb = ERB.new(template)
74
+
75
+ vars_binding = vars.send(:get_binding)
76
+ result=erb.result(vars_binding)
77
+
78
+ #Result = String
79
+ #JSON.parse result = Hash
80
+ #.to_json = String containing JSON formatting of Hash
81
+
82
+ json=JSON.parse(result).to_json
83
+
84
+ else
85
+ json=@json.to_json
86
+ end
87
+
30
88
  cooks=Array.new
31
89
  @cookbooks_path.each do |cook|
32
90
  cooks << File.join("/tmp/"+File.basename(cook))
33
91
  end
34
- cookpath="cookbook_path [\""+cooks.join("\",\"")+"\"]"
35
- loglevel="loglevel :debug"
36
- configfile=['file_cache_path "/var/chef-solo"',cookpath,loglevel]
37
- vm.instance.scp(StringIO.new(json),"/tmp/dna.json")
38
- vm.instance.scp(StringIO.new(configfile.join("\n")),"/tmp/solo.rb")
92
+
93
+ # Prepare solo.rb
94
+ configfile=['file_cache_path "/var/chef-solo"']
95
+ configfile << "cookbook_path [\""+cooks.join("\",\"")+"\"]"
96
+ configfile << "log_level #{log_level}"
97
+ configfile << "role_path \"/tmp/#{File.basename(roles_path)}\"" unless roles_path.nil?
98
+ configfile << "data_bag_path \"/tmp/#{File.basename(data_bags_path)}\"" unless data_bags_path.nil?
99
+
100
+ #convert string to Tempfile (instead of StringIO), as server.transfer expects a file with a filename
101
+ temp_file_json = Tempfile.new("dna_json")
102
+ temp_file_json.write(json)
103
+ temp_file_json.close
104
+
105
+ temp_file_solo = Tempfile.new("solo_rb")
106
+ temp_file_solo.write(configfile.join("\n"))
107
+ temp_file_solo.close
108
+
109
+ server.transfer(temp_file_json.path,"/tmp/dna.json")
110
+ server.transfer(temp_file_solo.path,"/tmp/solo.rb")
39
111
 
40
112
  # Share the cookbooks
113
+ i=0
41
114
  cookbooks_path.each do |path|
42
- Mccloud::Util.rsync(path,vm,vm.instance)
115
+ server.share_folder("cookbook_path-#{i}","/tmp/" + File.basename(path),path,{:mute => true})
116
+ i=i+1
43
117
  end
44
-
45
- puts "Running chef-solo"
46
- options={ :port => 22, :keys => [ vm.private_key ], :paranoid => false, :keys_only => true}
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")
118
+
119
+ unless roles_path.nil?
120
+ server.share_folder("roles_path","/tmp/" + File.basename(roles_path),roles_path,{:mute => true})
121
+ end
122
+
123
+ unless data_bags_path.nil?
124
+ server.share_folder("databags_path","/tmp/" + File.basename(data_bags_path),data_bags_path,{:mute => true})
51
125
  end
126
+
127
+ server.share
128
+
129
+ env.ui.info "[#{server.name}] - [#{@name}] - running chef-solo"
130
+ env.ui.info "[#{server.name}] - [#{@name}] - login as #{server.user}"
131
+ begin
132
+ if server.user=="root"
133
+ server.execute("chef-solo -c /tmp/solo.rb -j /tmp/dna.json -l #{@log_level}")
134
+ else
135
+ server.execute("sudo -i chef-solo -c /tmp/solo.rb -j /tmp/dna.json -l #{@log_level}")
136
+
137
+ #server.execute("sudo chef-solo -c /tmp/solo.rb -j /tmp/dna.json -l #{@log_level}")
138
+ end
139
+ rescue Exception
140
+ ensure
141
+ if @clean_after_run == true
142
+ env.ui.info "[#{server.name}] - [#{@name}] - Cleaning up dna.json"
143
+ server.execute("rm /tmp/dna.json",{:mute => true})
144
+ env.ui.info "[#{server.name}] - [#{@name}] - Cleaning up solo.json"
145
+ server.execute("rm /tmp/solo.rb", {:mute => true})
146
+ cookbooks_path.each do |path|
147
+ env.ui.info "[#{server.name}] - [#{@name}] - Cleaning cookbook_path #{path}"
148
+ server.execute("rm -rf /tmp/#{File.basename(path)}",{:mute => true})
149
+ end
150
+
151
+ unless roles_path.nil?
152
+ env.ui.info "[#{server.name}] - [#{@name}] - Cleaning roles_path #{roles_path}"
153
+ server.execute("rm -rf /tmp/#{File.basename(roles_path)}",{:mute => true})
154
+ end
155
+
156
+ unless data_bags_path.nil?
157
+ env.ui.info "[#{server.name}] - [#{@name}] - Cleaning data_bags_path #{data_bags_path}"
158
+ server.execute("rm -rf /tmp/#{File.basename(data_bags_path)}",{:mute => true})
159
+ end
160
+ end
161
+ end
162
+
163
+ #Cleaning up
164
+
52
165
  end
53
166
  # Returns the run list for the provisioning
54
167
  def run_list
@@ -76,77 +189,78 @@ module Mccloud
76
189
  :https_proxy => config.https_proxy,
77
190
  :https_proxy_user => config.https_proxy_user,
78
191
  :https_proxy_pass => config.https_proxy_pass,
192
+ :data_bag_path => config.data_bag_path,
193
+ :roles_path => config.roles_path,
79
194
  :no_proxy => config.no_proxy
80
- }.merge(template_vars))
195
+ }.merge(template_vars))
81
196
 
82
- # file_cache_path "/var/chef-solo"
83
- # cookbook_path "/var/chef-solo/cookbooks"
197
+ # file_cache_path "/var/chef-solo"
84
198
 
85
- #vm.ssh.upload!(StringIO.new(config_file), File.join(config.provisioning_path, filename))
86
- end
199
+ #server.execute.upload!(StringIO.new(config_file), File.join(config.provisioning_path, filename))
200
+ end
87
201
 
88
- def setup_json
202
+ def setup_json
89
203
 
90
- json = Mccloud::Config.config.chef.json.to_json
91
- #vm.ssh.upload!(StringIO.new(json), File.join(config.provisioning_path, "dna.json"))
92
- return json
93
- end
204
+ json = Mccloud::Config.config.chef.json.to_json
205
+ #server.execute.upload!(StringIO.new(json), File.join(config.provisioning_path, "dna.json"))
206
+ return json
207
+ end
94
208
 
95
- def prepare
96
- share_cookbook_folders
97
- share_role_folders
98
- end
209
+ def prepare
210
+ share_cookbook_folders
211
+ share_role_folder
212
+ end
99
213
 
100
- def provision!
101
- verify_binary("chef-solo")
102
- chown_provisioning_folder
103
- setup_json
104
- setup_solo_config
105
- run_chef_solo
106
- end
214
+ def provision!
215
+ verify_binary("chef-solo")
216
+ chown_provisioning_folder
217
+ setup_json
218
+ setup_solo_config
219
+ run_chef_solo
220
+ end
107
221
 
108
- def share_cookbook_folders
109
- host_cookbook_paths.each_with_index do |cookbook, i|
110
- env.config.vm.share_folder("v-csc-#{i}", cookbook_path(i), cookbook)
111
- end
222
+ def share_cookbook_folders
223
+ host_cookbook_paths.each_with_index do |cookbook, i|
224
+ env.config.vm.share_folder("v-csc-#{i}", cookbook_path(i), cookbook)
112
225
  end
226
+ end
113
227
 
114
- def share_role_folders
115
- host_role_paths.each_with_index do |role, i|
116
- env.config.vm.share_folder("v-csr-#{i}", role_path(i), role)
117
- end
228
+ def share_role_folder
229
+ host_roles_path.each_with_index do |role, i|
230
+ env.config.vm.share_folder("v-csr-#{i}", roles_path(i), role)
118
231
  end
232
+ end
119
233
 
120
- def setup_solo_config
121
- setup_config("chef_solo_solo", "solo.rb", {
122
- :node_name => config.node_name,
123
- :provisioning_path => config.provisioning_path,
124
- :cookbooks_path => cookbooks_path,
125
- :log_level => :debug,
126
- :recipe_url => config.recipe_url,
127
- :roles_path => roles_path,
128
- })
129
- end
130
- def run_chef_solo
131
- commands = ["cd #{config.provisioning_path}", "chef-solo -c solo.rb -j dna.json"]
132
-
133
- env.ui.info I18n.t("vagrant.provisioners.chef.running_solo")
134
- vm.ssh.execute do |ssh|
135
- ssh.sudo!(commands) do |channel, type, data|
136
- if type == :exit_status
137
- ssh.check_exit_status(data, commands)
138
- else
139
- env.ui.info("#{data}: #{type}")
140
- end
141
- end
234
+ def setup_solo_config
235
+ setup_config("chef_solo_solo", "solo.rb", {
236
+ :node_name => config.node_name,
237
+ :provisioning_path => config.provisioning_path,
238
+ :cookbooks_path => cookbooks_path,
239
+ :log_level => :debug,
240
+ :recipe_url => config.recipe_url,
241
+ :roles_path => roles_path,
242
+ :data_bags_path => data_bags_path,
243
+ })
244
+ end
245
+ def run_chef_solo
246
+ commands = ["cd #{config.provisioning_path}", "chef-solo -c solo.rb -j dna.json"]
247
+
248
+ server.execute.execute do |execute|
249
+ execute.sudo!(commands) do |channel, type, data|
250
+ if type == :exit_status
251
+ execute.check_exit_status(data, commands)
252
+ else
253
+ env.ui.info("#{data}: #{type}")
142
254
  end
143
255
  end
144
256
  end
145
- end #Module Provisioners
146
- end #Module Mccloud
257
+ end
258
+ end
259
+ end #Module Provisioners
260
+ end #Module Mccloud
147
261
 
148
262
 
149
- #cookbook_path "/etc/chef/recipes/cookbooks"
263
+ #cookbook_path "/etc/chef/recipes/cookbooks"
150
264
  #log_level :info
151
- #file_store_path "/etc/chef/recipes/"
152
- #file_cache_path "/etc/chef/recipes/"
265
+ #file_store_path "/etc/chef/recipes/"
266
+ #file_cache_path "/etc/chef/recipes/"
@@ -1,42 +1,215 @@
1
1
  require 'mccloud/util/rsync'
2
2
  require 'mccloud/util/ssh'
3
+ require 'erb'
4
+ require 'tempfile'
5
+
3
6
  module Mccloud
4
7
  module Provisioner
5
8
  class Puppet
6
-
7
- attr_accessor :manifest_file
8
- attr_accessor :manifests_path
9
- attr_accessor :module_path
10
- attr_accessor :pp_path
11
- attr_accessor :options
12
-
13
- def initialize
14
- @manifest_file = nil
15
- @manifests_path = "manifests"
16
- @module_path = nil
17
- @pp_path = "/tmp/vagrant-puppet"
18
- @options = []
19
- end
20
-
21
- def run(vm)
22
- # @module_paths.each do |from, to|
23
- # Mccloud::Util.rsync(path,vm,vm.instance)
24
- # end
25
-
26
- # @manifests_paths.each do |from, to|
27
- # Mccloud::Util.rsync(path,vm,vm.instance)
28
- # end
29
- vm.instance.ssh("mkdir -p #{@pp_path}")
30
- puts "Synching manifest #{@manifest_file}"
31
- vm.instance.scp(@manifest_file,"#{@pp_path}/manifest.pp")
32
-
33
- puts "Running puppet"
34
- options={ :port => 22, :keys => [ vm.private_key ], :paranoid => false, :keys_only => true}
35
- if vm.user=="root"
36
- Mccloud::Util.ssh(vm.instance.public_ip_address,vm.user,options,"puppet #{@pp_path}/manifest.pp")
9
+
10
+ attr_accessor :name
11
+ attr_accessor :env
12
+
13
+ attr_accessor :manifest_file
14
+ attr_accessor :manifests_path
15
+ attr_accessor :module_path
16
+ attr_accessor :pp_path
17
+ attr_accessor :options
18
+ attr_accessor :remote_environment
19
+
20
+ attr_reader :server
21
+
22
+ def initialize(env)
23
+ @env=env
24
+ @manifest_file = nil
25
+ @manifests_path = "manifests"
26
+ @module_paths = []
27
+ @pp_path = "/tmp/mccloud-puppet"
28
+ @name="puppet"
29
+ @options = []
30
+ @remote_environment={}
31
+ end
32
+
33
+ # Returns the manifests path expanded relative to the root path of the
34
+ # environment.
35
+ def expanded_manifests_path
36
+ Pathname.new(manifests_path).expand_path(env.root_path)
37
+ end
38
+
39
+
40
+ # Returns the module paths as an array of paths expanded relative to the
41
+ # root path.
42
+ def expanded_module_paths
43
+ return [] if !module_path
44
+
45
+ # Get all the paths and expand them relative to the root path, returning
46
+ # the array of expanded paths
47
+ paths = module_path
48
+ paths = [paths] if !paths.is_a?(Array)
49
+ paths.map do |path|
50
+ Pathname.new(path).expand_path(env.root_path)
51
+ end
52
+ end
53
+
54
+ # Returns the manifests paths as an array of paths expanded relative to the
55
+ # root path.
56
+ def expanded_manifests_paths
57
+ return [] if !manifests_path
58
+
59
+ # Get all the paths and expand them relative to the root path, returning
60
+ # the array of expanded paths
61
+ paths = manifests_path
62
+ paths = [paths] if !paths.is_a?(Array)
63
+ paths.map do |path|
64
+ Pathname.new(path).expand_path(env.root_path)
65
+ end
66
+ end
67
+
68
+ def share_modules
69
+ i=0
70
+ expanded_module_paths.each do |path|
71
+ remote_path=File.join(pp_path,"modules-#{i}")
72
+ env.ui.info "Sharing module dir #{path}"
73
+ server.share_sync(path,remote_path,{:mute => false})
74
+ server.execute("chmod 700 '#{remote_path}'")
75
+ i=i+1
76
+ end
77
+ end
78
+
79
+ def share_manifests
80
+ i=0
81
+ expanded_manifests_paths.each do |path|
82
+ remote_path=File.join(pp_path,"manifests-#{i}")
83
+ env.ui.info "Sharing manifest dir #{path}"
84
+ server.execute("test -d '#{remote_path}' || mkdir -p '#{remote_path}'")
85
+ server.share_sync(path,remote_path,{:mute => false})
86
+ server.execute("chmod 700 '#{remote_path}'")
87
+ i=i+1
88
+ end
89
+ end
90
+
91
+ def set_module_paths
92
+ @module_paths = {}
93
+ expanded_module_paths.each_with_index do |path, i|
94
+ @module_paths[path] = File.join(@pp_path, "modules-#{i}")
95
+ end
96
+ end
97
+
98
+ def share_manifest
99
+ if @manifest_file.nil?
100
+ # Nothing to do here
101
+ return
102
+ end
103
+
104
+ full_path=Pathname.new(File.join(manifests_path,@manifest_file)).expand_path(env.root_path).to_s
105
+
106
+ # These are the default
107
+ dest=File.join(@pp_path,File.basename(@manifest_file))
108
+ src=full_path
109
+
110
+ # ERB file
111
+ if is_erb?(full_path)
112
+ env.ui.info "Interpreting ERB puppet manifest"
113
+
114
+ # Correct the src path
115
+ temp_file = Tempfile.new("puppet_erb")
116
+ src=temp_file.path
117
+ result=erbify(full_path)
118
+ File.open(temp_file,'w') { |f| f.write(result)}
119
+
120
+ # Correct the dest path
121
+ dest=File.join(@pp_path,File.basename(@manifest_file,".erb"))
122
+
123
+ # Immediately unlink it
124
+ #temp_file.close(true)
125
+ end
126
+
127
+ env.ui.info "Synching manifest #{src} -> #{dest}"
128
+ server.transfer(src,dest)
129
+ end
130
+
131
+ def is_erb?(filename)
132
+ result=File.extname(filename) == ".erb"
133
+ puts result
134
+ return result
135
+ end
136
+
137
+ def erbify(filename)
138
+
139
+ # Fill the array to pass to the ERB
140
+ public_ips=Hash.new
141
+ private_ips=Hash.new
142
+ server.provider.vms.each do |name,vm|
143
+ public_ips[name] = vm.public_ip_address
144
+ private_ips[name] = vm.private_ip_address
145
+ end
146
+
147
+ data = { :public_ips => public_ips, :private_ips => private_ips}
148
+ vars = ErbBinding.new(data)
149
+
150
+ template = File.read(filename)
151
+ erb = ERB.new(template)
152
+
153
+ vars_binding = vars.send(:get_binding)
154
+ result=erb.result(vars_binding)
155
+ return result
156
+
157
+ end
158
+
159
+ def prepare
160
+ share_manifests
161
+ share_modules
162
+ share_manifest
163
+ set_module_paths
164
+ end
165
+
166
+ def cleanup
167
+ end
168
+
169
+ def run(server)
170
+ @server=server
171
+ if @manifest_file.nil?
172
+ env.ui.info "No specific manifestfile specified defaulting to site.pp in the manifest dir"
173
+ end
174
+
175
+ env.logger.info "Starting puppet run"
176
+ server.execute("mkdir -p '#{@pp_path}'")
177
+ server.execute("chmod 700 '#{@pp_path}'")
178
+ prepare
179
+
180
+ env.ui.info "Running puppet"
181
+
182
+ pre_options=[]
183
+ unless @remote_environment.empty?
184
+ @remote_environment.each do |key,value|
185
+ pre_options << "#{key.to_s}=\"#{value}\""
186
+ end
187
+ end
188
+
189
+ puppet_options=[ "apply"]
190
+ @options.each do |o|
191
+ puppet_options << o
192
+ end
193
+
194
+
195
+ unless @module_paths.empty?
196
+ puppet_options << "--modulepath=#{@module_paths.values.join(':')}"
197
+ end
198
+
199
+ manifestdir="#{File.join(@pp_path,'manifests-0')}"
200
+ puppet_options << "--manifestdir=#{manifestdir}"
201
+
202
+ if @manifest_file.nil?
203
+ puppet_options << File.join(manifestdir,"site.pp")
37
204
  else
38
- Mccloud::Util.ssh(vm.instance.public_ip_address,vm.user,options,"sudo puppet #{@pp_path}/manifest.pp")
205
+ if is_erb?(@manifest_file)
206
+ puppet_options << File.join(@pp_path,File.basename(@manifest_file,".erb"))
207
+ else
208
+ puppet_options << File.join(@pp_path,File.basename(@manifest_file))
209
+ end
39
210
  end
211
+
212
+ server.sudo("#{pre_options.join(" ")} puppet #{puppet_options.join(' ')}")
40
213
  end
41
214
  end #Class
42
215
  end #Module Provisioners
@@ -0,0 +1,48 @@
1
+ require 'erb'
2
+ require 'ostruct'
3
+
4
+ module Mccloud
5
+ module Provisioner
6
+
7
+ class Shell
8
+
9
+ attr_reader :name
10
+ attr_reader :env
11
+
12
+ attr_accessor :path
13
+ attr_accessor :inline
14
+ attr_accessor :sudo
15
+
16
+ def initialize(env)
17
+ @env=env
18
+ @sudo=false
19
+ @name ="shell"
20
+ @inline="who am i"
21
+ @log_level="info"
22
+ end
23
+
24
+ def run(server)
25
+ server.transfer(StringIO.new(@inline),"/tmp/shell-provisioner.sh") unless @inline.nil?
26
+ server.transfer(path,"/tmp/shell-provisioner.sh") unless @path.nil?
27
+
28
+ server.execute("chmod +x /tmp/shell-provisioner.sh",{:mute => true})
29
+
30
+ env.ui.info "[#{server.name}] - [#{@name}] - running shell"
31
+ env.ui.info "[#{server.name}] - [#{@name}] - login as #{server.user}"
32
+
33
+ begin
34
+ if !@sudo || server.user=="root"
35
+ server.execute("/tmp/shell-provisioner.sh")
36
+ else
37
+ server.execute("sudo /tmp/shell-provisioner.sh")
38
+ end
39
+ rescue Exception
40
+ ensure
41
+ env.ui.info "[#{server.name}] - [#{@name}] - Cleaning up script"
42
+ server.execute("rm /tmp/shell-provisioner.sh",{:mute => true})
43
+ end
44
+ end
45
+
46
+ end
47
+ end #Module Provisioners
48
+ end #Module Mccloud