wombat-cli 0.6.1 → 0.6.2

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 (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