wombat-cli 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (201) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +23 -23
  3. data/.travis.yml +22 -27
  4. data/CHANGELOG.md +438 -423
  5. data/DESIGN.md +49 -49
  6. data/Gemfile +5 -5
  7. data/README.md +146 -146
  8. data/Rakefile +26 -26
  9. data/bin/wombat +24 -24
  10. data/generator_files/Vagrantfile +120 -120
  11. data/generator_files/cookbooks/automate/.gitignore +16 -16
  12. data/generator_files/cookbooks/automate/.kitchen.ec2.yml +34 -34
  13. data/generator_files/cookbooks/automate/.kitchen.yml +24 -24
  14. data/generator_files/cookbooks/automate/Berksfile +6 -6
  15. data/generator_files/cookbooks/automate/README.md +4 -4
  16. data/generator_files/cookbooks/automate/chefignore +102 -102
  17. data/generator_files/cookbooks/automate/libraries/_helper.rb +52 -52
  18. data/generator_files/cookbooks/automate/libraries/delivery_api.rb +204 -204
  19. data/generator_files/cookbooks/automate/libraries/delivery_project.rb +31 -31
  20. data/generator_files/cookbooks/automate/libraries/dsl.rb +4 -4
  21. data/generator_files/cookbooks/automate/metadata.rb +11 -11
  22. data/generator_files/cookbooks/automate/recipes/default.rb +118 -124
  23. data/generator_files/cookbooks/automate/recipes/update-users.rb +48 -48
  24. data/generator_files/cookbooks/automate/templates/delivery.erb +6 -6
  25. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/files/automate.crt +26 -26
  26. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/files/automate.key +27 -27
  27. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/files/chef.crt +25 -25
  28. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/files/chef.key +27 -27
  29. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/files/compliance.crt +26 -26
  30. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/files/compliance.key +27 -27
  31. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/files/private.pem +27 -27
  32. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/files/public.pub +1 -1
  33. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/metadata.rb +3 -3
  34. data/generator_files/cookbooks/automate/test/fixtures/cookbooks/mock_data/recipes/default.rb +27 -27
  35. data/generator_files/cookbooks/automate/test/integration/default/automate_spec.rb +56 -56
  36. data/generator_files/cookbooks/build_node/.gitignore +16 -16
  37. data/generator_files/cookbooks/build_node/.kitchen.ec2.yml +37 -37
  38. data/generator_files/cookbooks/build_node/.kitchen.yml +23 -23
  39. data/generator_files/cookbooks/build_node/Berksfile +8 -8
  40. data/generator_files/cookbooks/build_node/README.md +4 -4
  41. data/generator_files/cookbooks/build_node/chefignore +102 -102
  42. data/generator_files/cookbooks/build_node/metadata.rb +12 -12
  43. data/generator_files/cookbooks/build_node/recipes/default.rb +38 -38
  44. data/generator_files/cookbooks/build_node/templates/client.erb +2 -2
  45. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/files/automate.crt +26 -26
  46. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/files/automate.key +27 -27
  47. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/files/chef.crt +25 -25
  48. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/files/chef.key +27 -27
  49. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/files/compliance.crt +26 -26
  50. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/files/compliance.key +27 -27
  51. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/files/private.pem +27 -27
  52. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/files/public.pub +1 -1
  53. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/metadata.rb +2 -2
  54. data/generator_files/cookbooks/build_node/test/fixtures/cookbooks/mock_data/recipes/default.rb +18 -18
  55. data/generator_files/cookbooks/build_node/test/integration/default/build-node_spec.rb +40 -40
  56. data/generator_files/cookbooks/chef_server/.gitignore +16 -16
  57. data/generator_files/cookbooks/chef_server/.kitchen.ec2.yml +34 -34
  58. data/generator_files/cookbooks/chef_server/.kitchen.yml +24 -24
  59. data/generator_files/cookbooks/chef_server/Berksfile +6 -6
  60. data/generator_files/cookbooks/chef_server/README.md +4 -4
  61. data/generator_files/cookbooks/chef_server/chefignore +102 -102
  62. data/generator_files/cookbooks/chef_server/metadata.rb +11 -11
  63. data/generator_files/cookbooks/chef_server/recipes/bootstrap_users.rb +91 -91
  64. data/generator_files/cookbooks/chef_server/recipes/default.rb +113 -113
  65. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/files/automate.crt +26 -26
  66. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/files/automate.key +27 -27
  67. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/files/chef.crt +25 -25
  68. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/files/chef.key +27 -27
  69. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/files/compliance.crt +26 -26
  70. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/files/compliance.key +27 -27
  71. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/files/private.pem +27 -27
  72. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/files/public.pub +1 -1
  73. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/metadata.rb +2 -2
  74. data/generator_files/cookbooks/chef_server/test/fixtures/cookbooks/mock_data/recipes/default.rb +23 -23
  75. data/generator_files/cookbooks/chef_server/test/integration/default/chef_server_spec.rb +50 -50
  76. data/generator_files/cookbooks/compliance/.gitignore +16 -16
  77. data/generator_files/cookbooks/compliance/.kitchen.ec2.yml +34 -34
  78. data/generator_files/cookbooks/compliance/.kitchen.yml +24 -24
  79. data/generator_files/cookbooks/compliance/Berksfile +7 -7
  80. data/generator_files/cookbooks/compliance/README.md +4 -4
  81. data/generator_files/cookbooks/compliance/chefignore +102 -102
  82. data/generator_files/cookbooks/compliance/metadata.rb +11 -11
  83. data/generator_files/cookbooks/compliance/recipes/default.rb +57 -57
  84. data/generator_files/cookbooks/compliance/spec/spec_helper.rb +2 -2
  85. data/generator_files/cookbooks/compliance/spec/unit/recipes/default_spec.rb +20 -20
  86. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/files/automate.crt +26 -26
  87. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/files/automate.key +27 -27
  88. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/files/chef.crt +25 -25
  89. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/files/chef.key +27 -27
  90. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/files/compliance.crt +26 -26
  91. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/files/compliance.key +27 -27
  92. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/files/private.pem +27 -27
  93. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/files/public.pub +1 -1
  94. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/metadata.rb +4 -4
  95. data/generator_files/cookbooks/compliance/test/fixtures/cookbooks/mock_data/recipes/default.rb +21 -21
  96. data/generator_files/cookbooks/compliance/test/integration/default/compliance.rb +28 -28
  97. data/generator_files/cookbooks/infranodes/.gitignore +16 -16
  98. data/generator_files/cookbooks/infranodes/.kitchen.ec2.yml +48 -48
  99. data/generator_files/cookbooks/infranodes/.kitchen.yml +21 -21
  100. data/generator_files/cookbooks/infranodes/Berksfile +6 -6
  101. data/generator_files/cookbooks/infranodes/README.md +4 -4
  102. data/generator_files/cookbooks/infranodes/attributes/default.rb +2 -2
  103. data/generator_files/cookbooks/infranodes/chefignore +102 -102
  104. data/generator_files/cookbooks/infranodes/metadata.rb +13 -13
  105. data/generator_files/cookbooks/infranodes/recipes/default.rb +57 -57
  106. data/generator_files/cookbooks/infranodes/spec/spec_helper.rb +2 -2
  107. data/generator_files/cookbooks/infranodes/spec/unit/recipes/default_spec.rb +20 -20
  108. data/generator_files/cookbooks/infranodes/templates/default/client.rb.erb +5 -5
  109. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/files/automate.crt +26 -26
  110. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/files/automate.key +27 -27
  111. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/files/chef.crt +25 -25
  112. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/files/chef.key +27 -27
  113. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/files/compliance.crt +26 -26
  114. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/files/compliance.key +27 -27
  115. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/files/private.pem +27 -27
  116. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/files/public.pub +1 -1
  117. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/metadata.rb +3 -3
  118. data/generator_files/cookbooks/infranodes/test/fixtures/cookbooks/mock_data/recipes/default.rb +27 -27
  119. data/generator_files/cookbooks/infranodes/test/integration/default/infranodes_spec.rb +22 -22
  120. data/generator_files/cookbooks/infranodes/test/integration/helpers/serverspec/spec_helper.rb +8 -8
  121. data/generator_files/cookbooks/wombat/.gitignore +16 -16
  122. data/generator_files/cookbooks/wombat/.kitchen.yml +43 -43
  123. data/generator_files/cookbooks/wombat/Berksfile +5 -5
  124. data/generator_files/cookbooks/wombat/README.md +4 -4
  125. data/generator_files/cookbooks/wombat/attributes/default.rb +79 -80
  126. data/generator_files/cookbooks/wombat/attributes/packer.rb +18 -18
  127. data/generator_files/cookbooks/wombat/chefignore +102 -102
  128. data/generator_files/cookbooks/wombat/metadata.rb +13 -13
  129. data/generator_files/cookbooks/wombat/recipes/authorized-keys.rb +20 -20
  130. data/generator_files/cookbooks/wombat/recipes/default.rb +111 -111
  131. data/generator_files/cookbooks/wombat/recipes/etc-hosts.rb +51 -51
  132. data/generator_files/cookbooks/workstation/.gitignore +16 -16
  133. data/generator_files/cookbooks/workstation/.kitchen.azure.yml +45 -0
  134. data/generator_files/cookbooks/workstation/.kitchen.ec2.yml +46 -30
  135. data/generator_files/cookbooks/workstation/.kitchen.yml +42 -22
  136. data/generator_files/cookbooks/workstation/Berksfile +7 -7
  137. data/generator_files/cookbooks/workstation/README.md +3 -3
  138. data/generator_files/cookbooks/workstation/chefignore +106 -102
  139. data/generator_files/cookbooks/workstation/files/atom.apm.list +10 -7
  140. data/generator_files/cookbooks/workstation/files/atom.config.cson +6 -3
  141. data/generator_files/cookbooks/workstation/{templates/default/ise_profile.ps1.erb → files/ise_profile.ps1} +11 -11
  142. data/generator_files/cookbooks/workstation/libraries/home.rb +4 -4
  143. data/generator_files/cookbooks/workstation/metadata.rb +14 -14
  144. data/generator_files/cookbooks/workstation/recipes/browser.rb +53 -58
  145. data/generator_files/cookbooks/workstation/recipes/certs-keys.rb +41 -45
  146. data/generator_files/cookbooks/workstation/recipes/chef.rb +29 -28
  147. data/generator_files/cookbooks/workstation/recipes/default.rb +24 -21
  148. data/generator_files/cookbooks/workstation/recipes/dotnet.rb +19 -17
  149. data/generator_files/cookbooks/workstation/recipes/editor.rb +46 -18
  150. data/generator_files/cookbooks/workstation/recipes/profile.rb +14 -41
  151. data/generator_files/cookbooks/workstation/recipes/terminal.rb +11 -11
  152. data/generator_files/cookbooks/workstation/templates/default/bookmarks.html.erb +23 -23
  153. data/generator_files/cookbooks/workstation/templates/default/data_collector.rb.erb +2 -2
  154. data/generator_files/cookbooks/workstation/templates/default/knife.rb.erb +10 -10
  155. data/generator_files/cookbooks/workstation/templates/default/master_preferences.json.erb +28 -28
  156. data/generator_files/cookbooks/workstation/templates/default/ssh_config.erb +16 -16
  157. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/files/automate.crt +26 -26
  158. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/files/automate.key +27 -27
  159. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/files/chef.crt +26 -26
  160. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/files/chef.key +27 -27
  161. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/files/compliance.crt +26 -26
  162. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/files/compliance.key +27 -27
  163. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/files/private.pem +27 -27
  164. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/files/public.pub +1 -1
  165. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/metadata.rb +2 -2
  166. data/generator_files/cookbooks/workstation/test/fixtures/cookbooks/mock_data/recipes/default.rb +21 -21
  167. data/generator_files/cookbooks/workstation/test/integration/default/workstation_spec.rb +77 -37
  168. data/generator_files/packer/automate.json +136 -136
  169. data/generator_files/packer/build-node.json +142 -142
  170. data/generator_files/packer/chef-server.json +137 -137
  171. data/generator_files/packer/compliance.json +133 -133
  172. data/generator_files/packer/infranodes-windows.json +143 -143
  173. data/generator_files/packer/infranodes.json +134 -134
  174. data/generator_files/packer/scripts/PreSysprep.ps1 +9 -0
  175. data/generator_files/packer/workstation.json +160 -142
  176. data/generator_files/templates/arm.md.json.erb +754 -754
  177. data/generator_files/templates/arm.vhd.json.erb +630 -630
  178. data/generator_files/templates/bootstrap-aws.erb +39 -39
  179. data/generator_files/templates/cfn.json.erb +675 -674
  180. data/generator_files/wombat.yml +75 -74
  181. data/lib/wombat/aws.rb +67 -67
  182. data/lib/wombat/build.rb +392 -392
  183. data/lib/wombat/cli.rb +254 -254
  184. data/lib/wombat/common.rb +420 -420
  185. data/lib/wombat/crypto.rb +65 -65
  186. data/lib/wombat/delete.rb +67 -67
  187. data/lib/wombat/deploy.rb +128 -128
  188. data/lib/wombat/init.rb +32 -32
  189. data/lib/wombat/latest.rb +27 -27
  190. data/lib/wombat/output.rb +101 -101
  191. data/lib/wombat/update.rb +20 -20
  192. data/lib/wombat/version.rb +3 -3
  193. data/lib/wombat.rb +8 -8
  194. data/spec/functional/common_spec.rb +26 -26
  195. data/spec/spec_helper.rb +103 -103
  196. data/spec/unit/common_spec.rb +116 -116
  197. data/terraform/README.md +13 -13
  198. data/terraform/templates/terraform.tfvars.erb +12 -12
  199. data/terraform/wombat.tf +328 -328
  200. data/wombat-cli.gemspec +36 -36
  201. metadata +6 -4
data/lib/wombat/crypto.rb CHANGED
@@ -1,66 +1,66 @@
1
- require 'openssl'
2
- require 'net/ssh'
3
-
4
- module Wombat
5
- module Crypto
6
- include Wombat::Common
7
-
8
- def gen_x509_cert(hostname)
9
- rsa_key = OpenSSL::PKey::RSA.new(2048)
10
- public_key = rsa_key.public_key
11
-
12
- subject = "/C=AU/ST=New South Wales/L=Sydney/O=#{wombat['org']}/OU=wombats/CN=#{wombat['domain_prefix']}#{hostname}.#{wombat['domain']}"
13
-
14
- cert = OpenSSL::X509::Certificate.new
15
- cert.subject = cert.issuer = OpenSSL::X509::Name.parse(subject)
16
- cert.not_before = Time.now
17
- cert.not_after = Time.now + 365 * 24 * 60 * 60
18
- cert.public_key = public_key
19
- cert.serial = 0x0
20
- cert.version = 2
21
-
22
- ef = OpenSSL::X509::ExtensionFactory.new
23
- ef.subject_certificate = cert
24
- ef.issuer_certificate = cert
25
- cert.extensions = [
26
- ef.create_extension('basicConstraints', 'CA:TRUE', true),
27
- ef.create_extension('subjectKeyIdentifier', 'hash'),
28
- ef.create_extension('subjectAltName', "DNS:#{wombat['domain_prefix']}#{hostname}.#{wombat['domain']},DNS:#{hostname}"),
29
- # ef.create_extension("keyUsage", "cRLSign,keyCertSign", true),
30
- ]
31
- cert.add_extension ef.create_extension('authorityKeyIdentifier',
32
- 'keyid:always,issuer:always')
33
-
34
- cert.sign(rsa_key, OpenSSL::Digest::SHA256.new)
35
-
36
- Dir.mkdir(conf['key_dir'], 0755) unless File.exist?(conf['key_dir'])
37
-
38
- if File.exist?("#{conf['key_dir']}/#{hostname}.crt") && File.exist?("#{conf['key_dir']}/#{hostname}.key")
39
- puts "An x509 certificate already exists for #{hostname}"
40
- else
41
- File.open("#{conf['key_dir']}/#{hostname}.crt", 'w') { |file| file.puts cert.to_pem }
42
- File.open("#{conf['key_dir']}/#{hostname}.key", 'w') { |file| file.puts rsa_key.to_pem }
43
- puts "Certificate created for #{wombat['domain_prefix']}#{hostname}.#{wombat['domain']}"
44
- end
45
- end
46
-
47
- def gen_ssh_key
48
- rsa_key = OpenSSL::PKey::RSA.new 2048
49
-
50
- type = rsa_key.ssh_type
51
- data = [rsa_key.to_blob].pack('m0')
52
-
53
- openssh_format = "#{type} #{data}"
54
-
55
- Dir.mkdir(conf['key_dir'], 0755) unless File.exist?(conf['key_dir'])
56
-
57
- if File.exist?("#{conf['key_dir']}/public.pub") && File.exist?("#{conf['key_dir']}/private.pem")
58
- puts 'An SSH keypair already exists'
59
- else
60
- File.open("#{conf['key_dir']}/public.pub", 'w') { |file| file.puts openssh_format }
61
- File.open("#{conf['key_dir']}/private.pem", 'w') { |file| file.puts rsa_key.to_pem }
62
- puts 'SSH Keypair created'
63
- end
64
- end
65
- end
1
+ require 'openssl'
2
+ require 'net/ssh'
3
+
4
+ module Wombat
5
+ module Crypto
6
+ include Wombat::Common
7
+
8
+ def gen_x509_cert(hostname)
9
+ rsa_key = OpenSSL::PKey::RSA.new(2048)
10
+ public_key = rsa_key.public_key
11
+
12
+ subject = "/C=AU/ST=New South Wales/L=Sydney/O=#{wombat['org']}/OU=wombats/CN=#{wombat['domain_prefix']}#{hostname}.#{wombat['domain']}"
13
+
14
+ cert = OpenSSL::X509::Certificate.new
15
+ cert.subject = cert.issuer = OpenSSL::X509::Name.parse(subject)
16
+ cert.not_before = Time.now
17
+ cert.not_after = Time.now + 365 * 24 * 60 * 60
18
+ cert.public_key = public_key
19
+ cert.serial = 0x0
20
+ cert.version = 2
21
+
22
+ ef = OpenSSL::X509::ExtensionFactory.new
23
+ ef.subject_certificate = cert
24
+ ef.issuer_certificate = cert
25
+ cert.extensions = [
26
+ ef.create_extension('basicConstraints', 'CA:TRUE', true),
27
+ ef.create_extension('subjectKeyIdentifier', 'hash'),
28
+ ef.create_extension('subjectAltName', "DNS:#{wombat['domain_prefix']}#{hostname}.#{wombat['domain']},DNS:#{hostname}"),
29
+ # ef.create_extension("keyUsage", "cRLSign,keyCertSign", true),
30
+ ]
31
+ cert.add_extension ef.create_extension('authorityKeyIdentifier',
32
+ 'keyid:always,issuer:always')
33
+
34
+ cert.sign(rsa_key, OpenSSL::Digest::SHA256.new)
35
+
36
+ Dir.mkdir(conf['key_dir'], 0755) unless File.exist?(conf['key_dir'])
37
+
38
+ if File.exist?("#{conf['key_dir']}/#{hostname}.crt") && File.exist?("#{conf['key_dir']}/#{hostname}.key")
39
+ puts "An x509 certificate already exists for #{hostname}"
40
+ else
41
+ File.open("#{conf['key_dir']}/#{hostname}.crt", 'w') { |file| file.puts cert.to_pem }
42
+ File.open("#{conf['key_dir']}/#{hostname}.key", 'w') { |file| file.puts rsa_key.to_pem }
43
+ puts "Certificate created for #{wombat['domain_prefix']}#{hostname}.#{wombat['domain']}"
44
+ end
45
+ end
46
+
47
+ def gen_ssh_key
48
+ rsa_key = OpenSSL::PKey::RSA.new 2048
49
+
50
+ type = rsa_key.ssh_type
51
+ data = [rsa_key.to_blob].pack('m0')
52
+
53
+ openssh_format = "#{type} #{data}"
54
+
55
+ Dir.mkdir(conf['key_dir'], 0755) unless File.exist?(conf['key_dir'])
56
+
57
+ if File.exist?("#{conf['key_dir']}/public.pub") && File.exist?("#{conf['key_dir']}/private.pem")
58
+ puts 'An SSH keypair already exists'
59
+ else
60
+ File.open("#{conf['key_dir']}/public.pub", 'w') { |file| file.puts openssh_format }
61
+ File.open("#{conf['key_dir']}/private.pem", 'w') { |file| file.puts rsa_key.to_pem }
62
+ puts 'SSH Keypair created'
63
+ end
64
+ end
65
+ end
66
66
  end
data/lib/wombat/delete.rb CHANGED
@@ -1,68 +1,68 @@
1
- require 'wombat/common'
2
- require 'aws-sdk'
3
- require 'azure_mgmt_resources'
4
-
5
- module Wombat
6
- class DeleteRunner
7
- include Wombat::Common
8
-
9
- attr_reader :stack, :cloud
10
- attr_accessor :resource_management_client
11
-
12
- def initialize(opts)
13
- @stack = opts.stack
14
- @cloud = opts.cloud.nil? ? "aws" : opts.cloud
15
- @force = opts.force.nil? ? false : opts.force
16
- @azure_async = opts.azure_async.nil? ? false : opts.azure_async
17
- @wombat_yml = opts.wombat_yml unless opts.wombat_yml.nil?
18
- end
19
-
20
- def start
21
- cfn_delete_stack(stack)
22
- end
23
-
24
- private
25
-
26
- def cfn_delete_stack(stack)
27
-
28
- # Delete the stack from the correct platform
29
- case @cloud
30
- when "aws"
31
- cfn = ::Aws::CloudFormation::Client.new(region: lock['aws']['region'])
32
-
33
- resp = cfn.delete_stack({
34
- stack_name: stack,
35
- })
36
- banner("Deleted #{stack}")
37
-
38
- when "azure"
39
-
40
- # Configure the delete state
41
- delete = false
42
-
43
- # Connect to Azure
44
- azure_conn = connect_azure()
45
-
46
- # Create a resource client so that the resource group can be deleted
47
- @resource_management_client = ::Azure::ARM::Resources::ResourceManagementClient.new(azure_conn)
48
- @resource_management_client.subscription_id = ENV['AZURE_SUBSCRIPTION_ID']
49
-
50
- # Check the stack that is being requested
51
- # If it is the parent group display a warning before attempting to delete
52
- if stack == wombat['name'] && !@force
53
- warn("You are attempting to delete the resource group that contains your custom images. If you wish to do this please specify the --force parameter on the command")
54
- else
55
- delete = true
56
- end
57
-
58
- if (delete)
59
- banner(format("Deleting resource group: %s", stack))
60
-
61
- resource_management_client.resource_groups.begin_delete(stack)
62
-
63
- info "Destroy operation accepted and will continue in the background."
64
- end
65
- end
66
- end
67
- end
1
+ require 'wombat/common'
2
+ require 'aws-sdk'
3
+ require 'azure_mgmt_resources'
4
+
5
+ module Wombat
6
+ class DeleteRunner
7
+ include Wombat::Common
8
+
9
+ attr_reader :stack, :cloud
10
+ attr_accessor :resource_management_client
11
+
12
+ def initialize(opts)
13
+ @stack = opts.stack
14
+ @cloud = opts.cloud.nil? ? "aws" : opts.cloud
15
+ @force = opts.force.nil? ? false : opts.force
16
+ @azure_async = opts.azure_async.nil? ? false : opts.azure_async
17
+ @wombat_yml = opts.wombat_yml unless opts.wombat_yml.nil?
18
+ end
19
+
20
+ def start
21
+ cfn_delete_stack(stack)
22
+ end
23
+
24
+ private
25
+
26
+ def cfn_delete_stack(stack)
27
+
28
+ # Delete the stack from the correct platform
29
+ case @cloud
30
+ when "aws"
31
+ cfn = ::Aws::CloudFormation::Client.new(region: lock['aws']['region'])
32
+
33
+ resp = cfn.delete_stack({
34
+ stack_name: stack,
35
+ })
36
+ banner("Deleted #{stack}")
37
+
38
+ when "azure"
39
+
40
+ # Configure the delete state
41
+ delete = false
42
+
43
+ # Connect to Azure
44
+ azure_conn = connect_azure()
45
+
46
+ # Create a resource client so that the resource group can be deleted
47
+ @resource_management_client = ::Azure::ARM::Resources::ResourceManagementClient.new(azure_conn)
48
+ @resource_management_client.subscription_id = ENV['AZURE_SUBSCRIPTION_ID']
49
+
50
+ # Check the stack that is being requested
51
+ # If it is the parent group display a warning before attempting to delete
52
+ if stack == wombat['name'] && !@force
53
+ warn("You are attempting to delete the resource group that contains your custom images. If you wish to do this please specify the --force parameter on the command")
54
+ else
55
+ delete = true
56
+ end
57
+
58
+ if (delete)
59
+ banner(format("Deleting resource group: %s", stack))
60
+
61
+ resource_management_client.resource_groups.begin_delete(stack)
62
+
63
+ info "Destroy operation accepted and will continue in the background."
64
+ end
65
+ end
66
+ end
67
+ end
68
68
  end
data/lib/wombat/deploy.rb CHANGED
@@ -1,128 +1,128 @@
1
- require 'wombat/common'
2
- require 'aws-sdk'
3
- require 'azure_mgmt_resources'
4
-
5
- module Wombat
6
- class DeployRunner
7
- include Wombat::Common
8
-
9
- attr_reader :stack, :stack_name, :cloud, :lock_opt, :template_opt, :nosuffix
10
- attr_accessor :resource_management_client
11
-
12
- def initialize(opts)
13
- @stack = opts.stack
14
- @stack_name = opts.stack_name
15
- @cloud = opts.cloud.nil? ? "aws" : opts.cloud
16
- @lock_opt = opts.update_lock
17
- @template_opt = opts.update_template
18
- @azure_async = opts.azure_async
19
- @wombat_yml = opts.wombat_yml
20
- @nosuffix = opts.nosuffix.nil? ? false : true
21
- end
22
-
23
- def start
24
- update_lock(cloud) if lock_opt
25
- update_template(cloud) if template_opt
26
- create_stack(stack)
27
- end
28
-
29
- private
30
-
31
- def create_stack(stack)
32
-
33
- # determine the filename of the stack
34
- filename = stack
35
-
36
- # work out the name of the stack to be created
37
- if !@stack_name.nil?
38
-
39
- # As the stack name has been specified then set nosuffix
40
- @nosuffix = true
41
- stack = stack_name
42
- end
43
-
44
- # Deploy the template to the correct stack
45
- case @cloud
46
- when "aws"
47
-
48
- template_file = File.read("#{conf['stack_dir']}/#{filename}.json")
49
- cfn = ::Aws::CloudFormation::Client.new(region: lock['aws']['region'])
50
-
51
- banner("Creating CloudFormation stack")
52
- resp = cfn.create_stack({
53
- stack_name: "#{stack}",
54
- template_body: template_file,
55
- capabilities: ["CAPABILITY_IAM"],
56
- on_failure: "DELETE",
57
- parameters: [
58
- {
59
- parameter_key: "KeyName",
60
- parameter_value: lock['aws']['keypair'],
61
- }
62
- ]
63
- })
64
- puts "Created: #{resp.stack_id}"
65
- when "azure"
66
-
67
- banner("Creating Azure RM stack")
68
-
69
- # determine the path to the arm template
70
- template_file = File.read("#{conf['stack_dir']}/#{filename}.json")
71
-
72
- # determine the name of the deployment
73
- deployment_name = format('deploy-%s', Time.now().to_i)
74
-
75
- # determine the name of the resource group
76
- resource_group_name = stack
77
- if !nosuffix
78
- resource_group_name = format('%s-%s', resource_group_name, Time.now.strftime('%Y%m%d%H%M%S'))
79
- end
80
-
81
- # Connect to azure
82
- azure_conn = connect_azure()
83
-
84
- # Create a resource client so that the template can be deployed
85
- @resource_management_client = Azure::ARM::Resources::ResourceManagementClient.new(azure_conn)
86
- @resource_management_client.subscription_id = ENV['AZURE_SUBSCRIPTION_ID']
87
-
88
- # Create the resource group for the deployment
89
- create_resource_group(resource_management_client,
90
- resource_group_name,
91
- wombat['azure']['location'],
92
- wombat['owner'],
93
- wombat['azure']['tags'])
94
-
95
- # Create the deployment definition
96
- deployment = Azure::ARM::Resources::Models::Deployment.new
97
- deployment.properties = Azure::ARM::Resources::Models::DeploymentProperties.new
98
- deployment.properties.mode = Azure::ARM::Resources::Models::DeploymentMode::Incremental
99
- deployment.properties.template = JSON.parse(template_file)
100
-
101
- # Perform the deployment to the named resource group
102
- begin
103
- resource_management_client.deployments.begin_create_or_update_async(resource_group_name, deployment_name, deployment).value!
104
- rescue MsRestAzure::AzureOperationError => operation_error
105
- rest_error = operation_error.body['error']
106
- deployment_active = rest_error['code'] == 'DeploymentActive'
107
- if deployment_active
108
- info format("Deployment for resource group '%s' is ongoing", resource_group_name)
109
- else
110
- warn rest_error
111
- raise operation_error
112
- end
113
- end
114
-
115
- # Monitor the deployment
116
- if @azure_async
117
- info "Deployment operation accepted. Use the Azure Portal to check progress"
118
- else
119
- follow_azure_deployment(resource_group_name, deployment_name)
120
- end
121
-
122
- end
123
- end
124
-
125
-
126
-
127
- end
128
- end
1
+ require 'wombat/common'
2
+ require 'aws-sdk'
3
+ require 'azure_mgmt_resources'
4
+
5
+ module Wombat
6
+ class DeployRunner
7
+ include Wombat::Common
8
+
9
+ attr_reader :stack, :stack_name, :cloud, :lock_opt, :template_opt, :nosuffix
10
+ attr_accessor :resource_management_client
11
+
12
+ def initialize(opts)
13
+ @stack = opts.stack
14
+ @stack_name = opts.stack_name
15
+ @cloud = opts.cloud.nil? ? "aws" : opts.cloud
16
+ @lock_opt = opts.update_lock
17
+ @template_opt = opts.update_template
18
+ @azure_async = opts.azure_async
19
+ @wombat_yml = opts.wombat_yml
20
+ @nosuffix = opts.nosuffix.nil? ? false : true
21
+ end
22
+
23
+ def start
24
+ update_lock(cloud) if lock_opt
25
+ update_template(cloud) if template_opt
26
+ create_stack(stack)
27
+ end
28
+
29
+ private
30
+
31
+ def create_stack(stack)
32
+
33
+ # determine the filename of the stack
34
+ filename = stack
35
+
36
+ # work out the name of the stack to be created
37
+ if !@stack_name.nil?
38
+
39
+ # As the stack name has been specified then set nosuffix
40
+ @nosuffix = true
41
+ stack = stack_name
42
+ end
43
+
44
+ # Deploy the template to the correct stack
45
+ case @cloud
46
+ when "aws"
47
+
48
+ template_file = File.read("#{conf['stack_dir']}/#{filename}.json")
49
+ cfn = ::Aws::CloudFormation::Client.new(region: lock['aws']['region'])
50
+
51
+ banner("Creating CloudFormation stack")
52
+ resp = cfn.create_stack({
53
+ stack_name: "#{stack}",
54
+ template_body: template_file,
55
+ capabilities: ["CAPABILITY_IAM"],
56
+ on_failure: "DELETE",
57
+ parameters: [
58
+ {
59
+ parameter_key: "KeyName",
60
+ parameter_value: lock['aws']['keypair'],
61
+ }
62
+ ]
63
+ })
64
+ puts "Created: #{resp.stack_id}"
65
+ when "azure"
66
+
67
+ banner("Creating Azure RM stack")
68
+
69
+ # determine the path to the arm template
70
+ template_file = File.read("#{conf['stack_dir']}/#{filename}.json")
71
+
72
+ # determine the name of the deployment
73
+ deployment_name = format('deploy-%s', Time.now().to_i)
74
+
75
+ # determine the name of the resource group
76
+ resource_group_name = stack
77
+ if !nosuffix
78
+ resource_group_name = format('%s-%s', resource_group_name, Time.now.strftime('%Y%m%d%H%M%S'))
79
+ end
80
+
81
+ # Connect to azure
82
+ azure_conn = connect_azure()
83
+
84
+ # Create a resource client so that the template can be deployed
85
+ @resource_management_client = Azure::ARM::Resources::ResourceManagementClient.new(azure_conn)
86
+ @resource_management_client.subscription_id = ENV['AZURE_SUBSCRIPTION_ID']
87
+
88
+ # Create the resource group for the deployment
89
+ create_resource_group(resource_management_client,
90
+ resource_group_name,
91
+ wombat['azure']['location'],
92
+ wombat['owner'],
93
+ wombat['azure']['tags'])
94
+
95
+ # Create the deployment definition
96
+ deployment = Azure::ARM::Resources::Models::Deployment.new
97
+ deployment.properties = Azure::ARM::Resources::Models::DeploymentProperties.new
98
+ deployment.properties.mode = Azure::ARM::Resources::Models::DeploymentMode::Incremental
99
+ deployment.properties.template = JSON.parse(template_file)
100
+
101
+ # Perform the deployment to the named resource group
102
+ begin
103
+ resource_management_client.deployments.begin_create_or_update_async(resource_group_name, deployment_name, deployment).value!
104
+ rescue MsRestAzure::AzureOperationError => operation_error
105
+ rest_error = operation_error.body['error']
106
+ deployment_active = rest_error['code'] == 'DeploymentActive'
107
+ if deployment_active
108
+ info format("Deployment for resource group '%s' is ongoing", resource_group_name)
109
+ else
110
+ warn rest_error
111
+ raise operation_error
112
+ end
113
+ end
114
+
115
+ # Monitor the deployment
116
+ if @azure_async
117
+ info "Deployment operation accepted. Use the Azure Portal to check progress"
118
+ else
119
+ follow_azure_deployment(resource_group_name, deployment_name)
120
+ end
121
+
122
+ end
123
+ end
124
+
125
+
126
+
127
+ end
128
+ end
data/lib/wombat/init.rb CHANGED
@@ -1,32 +1,32 @@
1
- require 'wombat/common'
2
-
3
- module Wombat
4
- class InitRunner
5
- include Wombat::Common
6
-
7
- attr_reader :path
8
-
9
- def initialize(opts)
10
- @path = opts.path.nil? ? Dir.pwd : opts.path
11
- end
12
-
13
- def start
14
- copy_files(path)
15
- end
16
-
17
- private
18
-
19
- def copy_files(path)
20
- p = path == Dir.pwd ? '.' : path
21
- gen_dir = "#{File.expand_path("../..", File.dirname(__FILE__))}/generator_files"
22
- Dir["#{gen_dir}/*"].each do |source|
23
- if !File.exist?("#{p}/#{File.basename(source)}")
24
- banner("create: #{p}/#{File.basename(source)}")
25
- FileUtils.cp_r source, path
26
- else
27
- warn("#{p}/#{File.basename(source)} already exists")
28
- end
29
- end
30
- end
31
- end
32
- end
1
+ require 'wombat/common'
2
+
3
+ module Wombat
4
+ class InitRunner
5
+ include Wombat::Common
6
+
7
+ attr_reader :path
8
+
9
+ def initialize(opts)
10
+ @path = opts.path.nil? ? Dir.pwd : opts.path
11
+ end
12
+
13
+ def start
14
+ copy_files(path)
15
+ end
16
+
17
+ private
18
+
19
+ def copy_files(path)
20
+ p = path == Dir.pwd ? '.' : path
21
+ gen_dir = "#{File.expand_path("../..", File.dirname(__FILE__))}/generator_files"
22
+ Dir["#{gen_dir}/*"].each do |source|
23
+ if !File.exist?("#{p}/#{File.basename(source)}")
24
+ banner("create: #{p}/#{File.basename(source)}")
25
+ FileUtils.cp_r source, path
26
+ else
27
+ warn("#{p}/#{File.basename(source)} already exists")
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
data/lib/wombat/latest.rb CHANGED
@@ -1,27 +1,27 @@
1
- require "wombat/common"
2
- require "wombat/aws"
3
-
4
- # http://docs.aws.amazon.com/sdkforruby/api/Aws/EC2/Client.html#describe_images-instance_method
5
- # https://github.com/test-kitchen/kitchen-ec2/blob/aa8e7f2cf9bfbb10fa4057f3297c2a20dc079f7b/lib/kitchen/driver/aws/standard_platform.rb
6
- # https://github.com/test-kitchen/kitchen-ec2/blob/aa8e7f2cf9bfbb10fa4057f3297c2a20dc079f7b/lib/kitchen/driver/aws/standard_platform/ubuntu.rb
7
-
8
- module Wombat
9
- class LatestRunner
10
- include Wombat::Common
11
- include Wombat::Aws
12
-
13
- attr_reader :stack, :cloud, :lock_opt, :template_opt
14
-
15
- def initialize(opts)
16
- @cloud = opts.cloud.nil? ? "aws" : opts.cloud
17
- end
18
-
19
- def start
20
- if cloud =~ /aws/
21
- find_latest_amis
22
- else
23
- puts "Unsupported for #{cloud}"
24
- end
25
- end
26
- end
27
- end
1
+ require "wombat/common"
2
+ require "wombat/aws"
3
+
4
+ # http://docs.aws.amazon.com/sdkforruby/api/Aws/EC2/Client.html#describe_images-instance_method
5
+ # https://github.com/test-kitchen/kitchen-ec2/blob/aa8e7f2cf9bfbb10fa4057f3297c2a20dc079f7b/lib/kitchen/driver/aws/standard_platform.rb
6
+ # https://github.com/test-kitchen/kitchen-ec2/blob/aa8e7f2cf9bfbb10fa4057f3297c2a20dc079f7b/lib/kitchen/driver/aws/standard_platform/ubuntu.rb
7
+
8
+ module Wombat
9
+ class LatestRunner
10
+ include Wombat::Common
11
+ include Wombat::Aws
12
+
13
+ attr_reader :stack, :cloud, :lock_opt, :template_opt
14
+
15
+ def initialize(opts)
16
+ @cloud = opts.cloud.nil? ? "aws" : opts.cloud
17
+ end
18
+
19
+ def start
20
+ if cloud =~ /aws/
21
+ find_latest_amis
22
+ else
23
+ puts "Unsupported for #{cloud}"
24
+ end
25
+ end
26
+ end
27
+ end