wombat-cli 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/DESIGN.md +11 -3
- data/{cookbooks → generator_files/cookbooks}/workstation/recipes/browser.rb +14 -0
- data/{templates → generator_files/templates}/cfn.json.erb +12 -0
- data/lib/wombat/build.rb +29 -14
- data/lib/wombat/cli.rb +64 -47
- data/lib/wombat/common.rb +120 -32
- data/lib/wombat/deploy.rb +2 -67
- data/lib/wombat/init.rb +30 -0
- data/lib/wombat/update.rb +17 -0
- data/lib/wombat/version.rb +1 -1
- metadata +172 -171
- data/wombat.example.yml +0 -62
- /data/{Vagrantfile → generator_files/Vagrantfile} +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/.gitignore +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/.kitchen.ec2.yml +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/.kitchen.yml +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/Berksfile +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/README.md +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/chefignore +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/libraries/_helper.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/libraries/delivery_api.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/libraries/delivery_project.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/libraries/dsl.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/metadata.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/recipes/default.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/recipes/update-users.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/templates/delivery.erb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/test/fixtures/cookbooks/mock_data/files/automate.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/test/fixtures/cookbooks/mock_data/files/automate.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/test/fixtures/cookbooks/mock_data/files/chef.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/test/fixtures/cookbooks/mock_data/files/chef.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/test/fixtures/cookbooks/mock_data/files/compliance.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/test/fixtures/cookbooks/mock_data/files/compliance.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/test/fixtures/cookbooks/mock_data/files/private.pem +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/test/fixtures/cookbooks/mock_data/files/public.pub +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/test/fixtures/cookbooks/mock_data/metadata.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/test/fixtures/cookbooks/mock_data/recipes/default.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/automate/test/integration/default/automate_spec.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/.gitignore +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/.kitchen.ec2.yml +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/.kitchen.yml +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/Berksfile +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/README.md +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/chefignore +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/metadata.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/recipes/default.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/templates/client.erb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/test/fixtures/cookbooks/mock_data/files/automate.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/test/fixtures/cookbooks/mock_data/files/automate.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/test/fixtures/cookbooks/mock_data/files/chef.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/test/fixtures/cookbooks/mock_data/files/chef.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/test/fixtures/cookbooks/mock_data/files/compliance.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/test/fixtures/cookbooks/mock_data/files/compliance.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/test/fixtures/cookbooks/mock_data/files/private.pem +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/test/fixtures/cookbooks/mock_data/files/public.pub +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/test/fixtures/cookbooks/mock_data/metadata.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/test/fixtures/cookbooks/mock_data/recipes/default.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/build_node/test/integration/default/build-node_spec.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/.gitignore +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/.kitchen.ec2.yml +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/.kitchen.yml +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/Berksfile +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/README.md +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/chefignore +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/metadata.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/recipes/bootstrap_users.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/recipes/default.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/test/fixtures/cookbooks/mock_data/files/automate.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/test/fixtures/cookbooks/mock_data/files/automate.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/test/fixtures/cookbooks/mock_data/files/chef.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/test/fixtures/cookbooks/mock_data/files/chef.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/test/fixtures/cookbooks/mock_data/files/compliance.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/test/fixtures/cookbooks/mock_data/files/compliance.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/test/fixtures/cookbooks/mock_data/files/private.pem +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/test/fixtures/cookbooks/mock_data/files/public.pub +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/test/fixtures/cookbooks/mock_data/metadata.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/test/fixtures/cookbooks/mock_data/recipes/default.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/chef_server/test/integration/default/chef_server_spec.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/.gitignore +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/.kitchen.ec2.yml +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/.kitchen.yml +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/Berksfile +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/README.md +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/chefignore +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/metadata.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/recipes/default.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/spec/spec_helper.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/spec/unit/recipes/default_spec.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/templates/default/chef-compliance.rb.erb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/test/fixtures/cookbooks/mock_data/files/automate.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/test/fixtures/cookbooks/mock_data/files/automate.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/test/fixtures/cookbooks/mock_data/files/chef.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/test/fixtures/cookbooks/mock_data/files/chef.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/test/fixtures/cookbooks/mock_data/files/compliance.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/test/fixtures/cookbooks/mock_data/files/compliance.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/test/fixtures/cookbooks/mock_data/files/private.pem +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/test/fixtures/cookbooks/mock_data/files/public.pub +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/test/fixtures/cookbooks/mock_data/metadata.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/test/fixtures/cookbooks/mock_data/recipes/default.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/compliance/test/integration/default/compliance.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/.gitignore +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/.kitchen.ec2.yml +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/.kitchen.yml +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/Berksfile +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/README.md +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/attributes/default.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/chefignore +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/metadata.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/recipes/default.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/spec/spec_helper.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/spec/unit/recipes/default_spec.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/templates/default/client.rb.erb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/test/fixtures/cookbooks/mock_data/files/automate.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/test/fixtures/cookbooks/mock_data/files/automate.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/test/fixtures/cookbooks/mock_data/files/chef.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/test/fixtures/cookbooks/mock_data/files/chef.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/test/fixtures/cookbooks/mock_data/files/compliance.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/test/fixtures/cookbooks/mock_data/files/compliance.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/test/fixtures/cookbooks/mock_data/files/private.pem +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/test/fixtures/cookbooks/mock_data/files/public.pub +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/test/fixtures/cookbooks/mock_data/metadata.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/test/fixtures/cookbooks/mock_data/recipes/default.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/test/integration/default/infranodes_spec.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/infranodes/test/integration/helpers/serverspec/spec_helper.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/wombat/.gitignore +0 -0
- /data/{cookbooks → generator_files/cookbooks}/wombat/.kitchen.yml +0 -0
- /data/{cookbooks → generator_files/cookbooks}/wombat/Berksfile +0 -0
- /data/{cookbooks → generator_files/cookbooks}/wombat/README.md +0 -0
- /data/{cookbooks → generator_files/cookbooks}/wombat/attributes/default.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/wombat/attributes/packer.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/wombat/chefignore +0 -0
- /data/{cookbooks → generator_files/cookbooks}/wombat/metadata.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/wombat/recipes/authorized-keys.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/wombat/recipes/default.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/wombat/recipes/etc-hosts.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/.gitignore +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/.kitchen.ec2.yml +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/.kitchen.yml +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/Berksfile +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/README.md +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/chefignore +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/files/atom.apm.list +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/files/atom.config.cson +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/files/cmder.xml +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/metadata.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/recipes/certs-keys.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/recipes/chef.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/recipes/default.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/recipes/dotnet.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/recipes/editor.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/recipes/profile.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/recipes/terminal.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/templates/default/bookmarks.html.erb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/templates/default/data_collector.rb.erb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/templates/default/ise_profile.ps1.erb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/templates/default/knife.rb.erb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/templates/default/master_preferences.json.erb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/templates/default/ssh_config.erb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/test/fixtures/cookbooks/mock_data/files/chef-server.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/test/fixtures/cookbooks/mock_data/files/chef-server.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/test/fixtures/cookbooks/mock_data/files/compliance.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/test/fixtures/cookbooks/mock_data/files/compliance.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/test/fixtures/cookbooks/mock_data/files/delivery.crt +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/test/fixtures/cookbooks/mock_data/files/delivery.key +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/test/fixtures/cookbooks/mock_data/files/private.pem +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/test/fixtures/cookbooks/mock_data/files/public.pub +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/test/fixtures/cookbooks/mock_data/metadata.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/test/fixtures/cookbooks/mock_data/recipes/default.rb +0 -0
- /data/{cookbooks → generator_files/cookbooks}/workstation/test/integration/default/workstation_spec.rb +0 -0
- /data/{packer → generator_files}/files/.gitkeep +0 -0
- /data/{packer → generator_files/packer}/automate.json +0 -0
- /data/{packer → generator_files/packer}/build-node.json +0 -0
- /data/{packer → generator_files/packer}/chef-server.json +0 -0
- /data/{packer → generator_files/packer}/compliance.json +0 -0
- /data/{packer → generator_files/packer}/infranodes-windows.json +0 -0
- /data/{packer → generator_files/packer}/infranodes.json +0 -0
- /data/{packer → generator_files/packer}/workstation.json +0 -0
- /data/{templates → generator_files/templates}/bootstrap-aws.erb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3a1385b339efd13cc101dba5b385915f2cb21265
|
4
|
+
data.tar.gz: 327d68edbc797dce831d4e3ae53101f3625a0826
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6134c463249083075e7bd4ba5b9c16ee5883af1d744509aa5206e3935c48bd6a8d3af9df5953797a6bf6700842243f83cb10da863f5f06cb2d786be044695ce3
|
7
|
+
data.tar.gz: 364be3f32ffdac77f61a9d2405eba09527041fc47088242080ca2aacd4e092b96eaded8195612cd00f2dd04494dc92076c5527c52788fdcbcf00bc742ae8c405
|
data/DESIGN.md
CHANGED
@@ -26,11 +26,19 @@ The core of wombat is the binary `bin/wombat`.
|
|
26
26
|
|
27
27
|
* If the TEMPLATE argument is not provided it will execute against all templates in `./packer/`
|
28
28
|
|
29
|
-
`wombat
|
29
|
+
`wombat update lock`
|
30
30
|
|
31
31
|
1. Create/update wombat.lock based on most recent Packer logs
|
32
|
-
|
33
|
-
|
32
|
+
|
33
|
+
`wombat update template`
|
34
|
+
|
35
|
+
1. Create cfn/gdm configuration from lock
|
36
|
+
|
37
|
+
* If no argument is provided it will update _both_ lock and template
|
38
|
+
|
39
|
+
`wombat deploy STACK`
|
40
|
+
|
41
|
+
1. Deploy cfn/gdm stack
|
34
42
|
|
35
43
|
`wombat outputs STACK`
|
36
44
|
|
@@ -43,3 +43,17 @@ registry_key 'Set Chrome as default HTTPS protocol association' do
|
|
43
43
|
{:name => 'ProgId', :type => :string, :data => 'ChromeHTML'}
|
44
44
|
]
|
45
45
|
end
|
46
|
+
|
47
|
+
# Enable ClearType for Chrome 52+
|
48
|
+
registry_key "HKEY_CURRENT_USER\\Control Panel\\Desktop" do
|
49
|
+
values [{
|
50
|
+
:name => "FontSmoothing",
|
51
|
+
:type => :string,
|
52
|
+
:data => 2
|
53
|
+
},{
|
54
|
+
:name => "FontSmoothingType",
|
55
|
+
:type => :dword,
|
56
|
+
:data => 2
|
57
|
+
}]
|
58
|
+
action :create
|
59
|
+
end
|
@@ -77,6 +77,15 @@
|
|
77
77
|
}
|
78
78
|
},
|
79
79
|
"Resources": {
|
80
|
+
<% if @iam_roles -%>
|
81
|
+
"InstanceProfile" : {
|
82
|
+
"Type" : "AWS::IAM::InstanceProfile",
|
83
|
+
"Properties" : {
|
84
|
+
"Path" : "/",
|
85
|
+
"Roles" : <%= @iam_roles %>
|
86
|
+
}
|
87
|
+
},
|
88
|
+
<% end -%>
|
80
89
|
"VPC": {
|
81
90
|
"Type": "AWS::EC2::VPC",
|
82
91
|
"Properties": {
|
@@ -341,6 +350,9 @@
|
|
341
350
|
"Type": "AWS::EC2::Instance",
|
342
351
|
"Properties": {
|
343
352
|
"InstanceType": "m3.large",
|
353
|
+
<% if @iam_roles -%>
|
354
|
+
"IamInstanceProfile" : {"Ref" : "InstanceProfile"},
|
355
|
+
<% end -%>
|
344
356
|
"AvailabilityZone": { "Ref": "AvailabilityZone" },
|
345
357
|
"NetworkInterfaces": [
|
346
358
|
{
|
data/lib/wombat/build.rb
CHANGED
@@ -10,13 +10,16 @@ class BuildRunner
|
|
10
10
|
attr_reader :templates, :builder, :config, :parallel
|
11
11
|
|
12
12
|
def initialize(opts)
|
13
|
-
@templates = opts.templates
|
13
|
+
@templates = opts.templates.nil? ? calculate_templates : opts.templates
|
14
14
|
@builder = opts.builder.nil? ? "amazon-ebs" : opts.builder
|
15
15
|
@config = opts.config
|
16
16
|
@parallel = opts.parallel
|
17
17
|
end
|
18
18
|
|
19
19
|
def start
|
20
|
+
if which('packer').nil?
|
21
|
+
raise "packer binary not found in path, exiting..."
|
22
|
+
end
|
20
23
|
banner("Generating certs (if necessary)")
|
21
24
|
wombat['certs'].each do |hostname|
|
22
25
|
gen_x509_cert(hostname)
|
@@ -70,19 +73,19 @@ class BuildRunner
|
|
70
73
|
}
|
71
74
|
}
|
72
75
|
end
|
73
|
-
elsif template_name
|
76
|
+
elsif template_name =~ /build-node/
|
74
77
|
build_nodes.each do |name, num|
|
75
78
|
proc_hash[name] = {
|
76
|
-
'template' =>
|
79
|
+
'template' => template_name,
|
77
80
|
'options' => {
|
78
81
|
'node-number' => num
|
79
82
|
}
|
80
83
|
}
|
81
84
|
end
|
82
|
-
elsif template_name
|
85
|
+
elsif template_name =~ /workstation/
|
83
86
|
workstations.each do |name, num|
|
84
87
|
proc_hash[name] = {
|
85
|
-
'template' =>
|
88
|
+
'template' => template_name,
|
86
89
|
'options' => {
|
87
90
|
'os' => wombat['workstations']['platform'],
|
88
91
|
'workstation-number' => num
|
@@ -117,7 +120,7 @@ class BuildRunner
|
|
117
120
|
end
|
118
121
|
|
119
122
|
def shell_out_command(command)
|
120
|
-
cmd = Mixlib::ShellOut.new(a_to_s(command), :timeout => timeout, live_stream: STDOUT)
|
123
|
+
cmd = Mixlib::ShellOut.new(a_to_s(command), :timeout => conf['timeout'], live_stream: STDOUT)
|
121
124
|
cmd.run_command
|
122
125
|
cmd
|
123
126
|
end
|
@@ -139,18 +142,18 @@ class BuildRunner
|
|
139
142
|
else
|
140
143
|
base = template.split('.json')[0].tr('-', '_')
|
141
144
|
end
|
142
|
-
rm_cmd = "rm -rf #{cookbook_dir}/#{base}/Berksfile.lock vendored-cookbooks/#{base}"
|
145
|
+
rm_cmd = "rm -rf #{conf['cookbook_dir']}/#{base}/Berksfile.lock vendored-cookbooks/#{base}"
|
143
146
|
shell_out_command(rm_cmd)
|
144
|
-
vendor_cmd = "berks vendor -q -b #{cookbook_dir}/#{base}/Berksfile vendored-cookbooks/#{base}"
|
147
|
+
vendor_cmd = "berks vendor -q -b #{conf['cookbook_dir']}/#{base}/Berksfile vendored-cookbooks/#{base}"
|
145
148
|
shell_out_command(vendor_cmd)
|
146
149
|
end
|
147
150
|
|
148
151
|
def log(template, builder, options)
|
149
152
|
cloud = b_to_c(builder)
|
150
153
|
case template
|
151
|
-
when
|
154
|
+
when /build-node/
|
152
155
|
log_name = "#{cloud}-build-node-#{options['node-number']}-#{linux}"
|
153
|
-
when
|
156
|
+
when /workstation/
|
154
157
|
log_name = "#{cloud}-workstation-#{options['workstation-number']}-#{linux}"
|
155
158
|
when /infranodes/
|
156
159
|
if options['os'] =~ /windows/
|
@@ -161,13 +164,24 @@ class BuildRunner
|
|
161
164
|
else
|
162
165
|
log_name = "#{cloud}-#{template}-#{linux}"
|
163
166
|
end
|
164
|
-
log_file = "#{log_dir}/#{log_name}.log"
|
167
|
+
log_file = "#{conf['log_dir']}/#{log_name}.log"
|
168
|
+
end
|
169
|
+
|
170
|
+
def which(cmd)
|
171
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
172
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
173
|
+
exts.each { |ext|
|
174
|
+
exe = File.join(path, "#{cmd}#{ext}")
|
175
|
+
return exe if File.executable?(exe) && !File.directory?(exe)
|
176
|
+
}
|
177
|
+
end
|
178
|
+
return nil
|
165
179
|
end
|
166
180
|
|
167
181
|
def packer_build_cmd(template, builder, options)
|
168
182
|
create_infranodes_json
|
169
183
|
|
170
|
-
if template
|
184
|
+
if template =~ /workstation/
|
171
185
|
source_ami = wombat['aws']['source_ami']['windows']
|
172
186
|
source_image = wombat['gce']['source_image']['windows']
|
173
187
|
elsif template =~ /infranodes/
|
@@ -183,8 +197,9 @@ class BuildRunner
|
|
183
197
|
source_image = wombat['gce']['source_image'][linux]
|
184
198
|
end
|
185
199
|
|
186
|
-
|
187
|
-
|
200
|
+
Dir.mkdir(conf['log_dir'], 0755) unless File.exist?(conf['log_dir'])
|
201
|
+
|
202
|
+
cmd = %W(packer build #{conf['packer_dir']}/#{template}.json | tee #{log(template, builder, options)})
|
188
203
|
cmd.insert(2, "--only #{builder}")
|
189
204
|
cmd.insert(2, "--var org=#{wombat['org']}")
|
190
205
|
cmd.insert(2, "--var domain=#{wombat['domain']}")
|
data/lib/wombat/cli.rb
CHANGED
@@ -7,6 +7,8 @@ require 'wombat/build'
|
|
7
7
|
require 'wombat/deploy'
|
8
8
|
require 'wombat/output'
|
9
9
|
require 'wombat/delete'
|
10
|
+
require 'wombat/update'
|
11
|
+
require 'wombat/init'
|
10
12
|
|
11
13
|
class Options
|
12
14
|
|
@@ -14,7 +16,6 @@ class Options
|
|
14
16
|
|
15
17
|
def self.parse(args)
|
16
18
|
options = OpenStruct.new
|
17
|
-
options.templates = calculate_templates("*.json")
|
18
19
|
|
19
20
|
global = OptionParser.new do |opts|
|
20
21
|
opts.banner = "Usage: #{NAME} [SUBCOMMAND [options]]"
|
@@ -22,23 +23,18 @@ class Options
|
|
22
23
|
opts.version = Wombat::VERSION
|
23
24
|
opts.separator <<-COMMANDS.gsub(/^ {8}/, "")
|
24
25
|
build : build one or more templates
|
26
|
+
delete : delete a stack
|
27
|
+
deploy : deploy a stack
|
25
28
|
help : prints this help message
|
29
|
+
init : create wombat skeleton project
|
26
30
|
list : list all templates in project
|
27
|
-
deploy : deploy a stack
|
28
31
|
outputs : get outputs for a stack
|
29
|
-
|
32
|
+
update : update lock and/or cloud template
|
30
33
|
COMMANDS
|
31
34
|
end
|
32
35
|
|
33
36
|
templates_argv_proc = proc { |options|
|
34
|
-
options.templates =
|
35
|
-
|
36
|
-
options.templates.each do |t|
|
37
|
-
if !File.exists?("packer/#{t}.json")
|
38
|
-
$stderr.puts "File packer/#{t}.json does not exist for template '#{t}'"
|
39
|
-
exit(1)
|
40
|
-
end
|
41
|
-
end
|
37
|
+
options.templates = ARGV unless args.empty?
|
42
38
|
}
|
43
39
|
|
44
40
|
box_version_argv_proc = proc { |options|
|
@@ -50,14 +46,11 @@ class Options
|
|
50
46
|
options.stack = ARGV[0]
|
51
47
|
}
|
52
48
|
|
49
|
+
file_argv_proc = proc { |options|
|
50
|
+
options.file = ARGV[0]
|
51
|
+
}
|
52
|
+
|
53
53
|
subcommand = {
|
54
|
-
help: {
|
55
|
-
parser: OptionParser.new {},
|
56
|
-
argv: proc { |options|
|
57
|
-
puts global
|
58
|
-
exit(0)
|
59
|
-
}
|
60
|
-
},
|
61
54
|
build: {
|
62
55
|
class: BuildRunner,
|
63
56
|
parser: OptionParser.new { |opts|
|
@@ -77,17 +70,14 @@ class Options
|
|
77
70
|
},
|
78
71
|
argv: templates_argv_proc
|
79
72
|
},
|
80
|
-
|
81
|
-
class:
|
82
|
-
parser: OptionParser.new { |opts|
|
83
|
-
opts.banner = "Usage: #{NAME} list [TEMPLATE ...]"
|
84
|
-
},
|
85
|
-
argv: templates_argv_proc
|
86
|
-
},
|
87
|
-
outputs: {
|
88
|
-
class: OutputRunner,
|
73
|
+
delete: {
|
74
|
+
class: DeleteRunner,
|
89
75
|
parser: OptionParser.new { |opts|
|
90
|
-
opts.banner = "Usage: #{NAME}
|
76
|
+
opts.banner = "Usage: #{NAME} delete STACK"
|
77
|
+
|
78
|
+
opts.on("-c CLOUD", "--cloud CLOUD", "Select cloud") do |opt|
|
79
|
+
options.cloud = opt
|
80
|
+
end
|
91
81
|
},
|
92
82
|
argv: stack_argv_proc
|
93
83
|
},
|
@@ -104,23 +94,54 @@ class Options
|
|
104
94
|
options.update_lock = opt
|
105
95
|
end
|
106
96
|
|
107
|
-
opts.on("--
|
97
|
+
opts.on("--update-template", "Update template") do |opt|
|
108
98
|
options.create_template = opt
|
109
99
|
end
|
110
100
|
},
|
111
101
|
argv: stack_argv_proc
|
112
102
|
},
|
113
|
-
|
114
|
-
|
103
|
+
help: {
|
104
|
+
parser: OptionParser.new {},
|
105
|
+
argv: proc { |options|
|
106
|
+
puts global
|
107
|
+
exit(0)
|
108
|
+
}
|
109
|
+
},
|
110
|
+
init: {
|
111
|
+
class: InitRunner,
|
115
112
|
parser: OptionParser.new { |opts|
|
116
|
-
opts.banner = "Usage: #{NAME}
|
113
|
+
opts.banner = "Usage: #{NAME} init"
|
114
|
+
|
115
|
+
opts.on("-p PATH", "--path PATH", "Path to copy skeleton") do |opt|
|
116
|
+
options.path = opt
|
117
|
+
end
|
118
|
+
},
|
119
|
+
argv: stack_argv_proc
|
120
|
+
},
|
121
|
+
list: {
|
122
|
+
class: ListRunner,
|
123
|
+
parser: OptionParser.new { |opts|
|
124
|
+
opts.banner = "Usage: #{NAME} list [TEMPLATE ...]"
|
125
|
+
},
|
126
|
+
argv: templates_argv_proc
|
127
|
+
},
|
128
|
+
outputs: {
|
129
|
+
class: OutputRunner,
|
130
|
+
parser: OptionParser.new { |opts|
|
131
|
+
opts.banner = "Usage: #{NAME} outputs [TEMPLATE ...]"
|
132
|
+
},
|
133
|
+
argv: stack_argv_proc
|
134
|
+
},
|
135
|
+
update: {
|
136
|
+
class: UpdateRunner,
|
137
|
+
parser: OptionParser.new { |opts|
|
138
|
+
opts.banner = "Usage: #{NAME} update [lock || template]"
|
117
139
|
|
118
140
|
opts.on("-c CLOUD", "--cloud CLOUD", "Select cloud") do |opt|
|
119
141
|
options.cloud = opt
|
120
142
|
end
|
121
143
|
},
|
122
|
-
|
123
|
-
argv: stack_argv_proc
|
144
|
+
argv: file_argv_proc
|
124
145
|
}
|
125
146
|
}
|
126
147
|
|
@@ -135,17 +156,6 @@ class Options
|
|
135
156
|
|
136
157
|
options
|
137
158
|
end
|
138
|
-
|
139
|
-
def self.calculate_templates(globs)
|
140
|
-
Dir.chdir('packer') do
|
141
|
-
Array(globs).
|
142
|
-
map { |glob| result = Dir.glob("#{glob}"); result.empty? ? glob : result }.
|
143
|
-
flatten.
|
144
|
-
sort.
|
145
|
-
delete_if { |file| file =~ /\.variables\./ }.
|
146
|
-
map { |template| template.sub(/\.json$/, '') }
|
147
|
-
end
|
148
|
-
end
|
149
159
|
end
|
150
160
|
|
151
161
|
class ListRunner
|
@@ -155,11 +165,18 @@ class ListRunner
|
|
155
165
|
attr_reader :templates
|
156
166
|
|
157
167
|
def initialize(opts)
|
158
|
-
@templates = opts.templates
|
168
|
+
@templates = opts.templates.nil? ? calculate_templates : opts.templates
|
159
169
|
end
|
160
170
|
|
161
171
|
def start
|
162
|
-
templates.each
|
172
|
+
templates.each do |t|
|
173
|
+
if !File.exists?("#{conf['packer_dir']}/#{t}.json")
|
174
|
+
$stderr.puts "File #{conf['packer_dir']}/#{t}.json does not exist for template '#{t}'"
|
175
|
+
exit(1)
|
176
|
+
else
|
177
|
+
puts t
|
178
|
+
end
|
179
|
+
end
|
163
180
|
end
|
164
181
|
end
|
165
182
|
|
data/lib/wombat/common.rb
CHANGED
@@ -4,6 +4,7 @@ require 'erb'
|
|
4
4
|
require 'openssl'
|
5
5
|
require 'net/ssh'
|
6
6
|
require 'benchmark'
|
7
|
+
require 'fileutils'
|
7
8
|
|
8
9
|
module Common
|
9
10
|
|
@@ -28,22 +29,28 @@ module Common
|
|
28
29
|
|
29
30
|
def wombat
|
30
31
|
if !File.exists?('wombat.yml')
|
31
|
-
|
32
|
-
|
33
|
-
|
32
|
+
warn('No wombat.yml found, copying example')
|
33
|
+
gen_dir = "#{File.expand_path("../..", File.dirname(__FILE__))}/generator_files"
|
34
|
+
FileUtils.cp_r "#{gen_dir}/wombat.yml", Dir.pwd
|
34
35
|
end
|
35
36
|
YAML.load(File.read('wombat.yml'))
|
36
37
|
end
|
37
38
|
|
38
39
|
def lock
|
39
|
-
|
40
|
+
if !File.exists?('wombat.lock')
|
41
|
+
warn('No wombat.lock found')
|
42
|
+
return 1
|
43
|
+
else
|
44
|
+
JSON.parse(File.read('wombat.lock'))
|
45
|
+
end
|
40
46
|
end
|
41
47
|
|
42
48
|
def bootstrap_aws
|
43
49
|
@workstation_passwd = wombat['workstations']['password']
|
44
|
-
rendered = ERB.new(File.read('
|
45
|
-
|
46
|
-
|
50
|
+
rendered = ERB.new(File.read("#{conf['template_dir']}/bootstrap-aws.erb"), nil, '-').result(binding)
|
51
|
+
Dir.mkdir("#{conf['packer_dir']}/scripts", 0755) unless File.exist?("#{conf['packer_dir']}/scripts")
|
52
|
+
File.open("#{conf['packer_dir']}/scripts/bootstrap-aws.txt", 'w') { |file| file.puts rendered }
|
53
|
+
banner("Generated: #{conf['packer_dir']}/scripts/bootstrap-aws.txt")
|
47
54
|
end
|
48
55
|
|
49
56
|
def gen_x509_cert(hostname)
|
@@ -72,12 +79,14 @@ module Common
|
|
72
79
|
'keyid:always,issuer:always')
|
73
80
|
|
74
81
|
cert.sign(rsa_key, OpenSSL::Digest::SHA256.new)
|
82
|
+
|
83
|
+
Dir.mkdir(conf['key_dir'], 0755) unless File.exist?(conf['key_dir'])
|
75
84
|
|
76
|
-
if File.exist?("#{key_dir}/#{hostname}.crt") && File.exist?("#{key_dir}/#{hostname}.key")
|
85
|
+
if File.exist?("#{conf['key_dir']}/#{hostname}.crt") && File.exist?("#{conf['key_dir']}/#{hostname}.key")
|
77
86
|
puts "An x509 certificate already exists for #{hostname}"
|
78
87
|
else
|
79
|
-
File.open("#{key_dir}/#{hostname}.crt", 'w') { |file| file.puts cert.to_pem }
|
80
|
-
File.open("#{key_dir}/#{hostname}.key", 'w') { |file| file.puts rsa_key.to_pem }
|
88
|
+
File.open("#{conf['key_dir']}/#{hostname}.crt", 'w') { |file| file.puts cert.to_pem }
|
89
|
+
File.open("#{conf['key_dir']}/#{hostname}.key", 'w') { |file| file.puts rsa_key.to_pem }
|
81
90
|
puts "Certificate created for #{wombat['domain_prefix']}#{hostname}.#{wombat['domain']}"
|
82
91
|
end
|
83
92
|
end
|
@@ -90,11 +99,13 @@ module Common
|
|
90
99
|
|
91
100
|
openssh_format = "#{type} #{data}"
|
92
101
|
|
93
|
-
|
102
|
+
Dir.mkdir(conf['key_dir'], 0755) unless File.exist?(conf['key_dir'])
|
103
|
+
|
104
|
+
if File.exist?("#{conf['key_dir']}/public.pub") && File.exist?("#{conf['key_dir']}/private.pem")
|
94
105
|
puts 'An SSH keypair already exists'
|
95
106
|
else
|
96
|
-
File.open("#{key_dir}/public.pub", 'w') { |file| file.puts openssh_format }
|
97
|
-
File.open("#{key_dir}/private.pem", 'w') { |file| file.puts rsa_key.to_pem }
|
107
|
+
File.open("#{conf['key_dir']}/public.pub", 'w') { |file| file.puts openssh_format }
|
108
|
+
File.open("#{conf['key_dir']}/private.pem", 'w') { |file| file.puts rsa_key.to_pem }
|
98
109
|
puts 'SSH Keypair created'
|
99
110
|
end
|
100
111
|
end
|
@@ -129,13 +140,13 @@ module Common
|
|
129
140
|
end
|
130
141
|
|
131
142
|
def create_infranodes_json
|
132
|
-
if File.exists?("#{packer_dir}/file/infranodes-info.json")
|
143
|
+
if File.exists?("#{conf['packer_dir']}/file/infranodes-info.json")
|
133
144
|
current_state = JSON(File.read('files/infranodes-info.json'))
|
134
145
|
else
|
135
146
|
current_state = nil
|
136
147
|
end
|
137
148
|
return if current_state == infranodes # yay idempotence
|
138
|
-
File.open("#{packer_dir}/files/infranodes-info.json", 'w') do |f|
|
149
|
+
File.open("#{conf['packer_dir']}/files/infranodes-info.json", 'w') do |f|
|
139
150
|
f.puts JSON.pretty_generate(infranodes)
|
140
151
|
end
|
141
152
|
end
|
@@ -144,35 +155,112 @@ module Common
|
|
144
155
|
wombat['linux'].nil? ? 'ubuntu' : wombat['linux']
|
145
156
|
end
|
146
157
|
|
147
|
-
def
|
148
|
-
|
158
|
+
def conf
|
159
|
+
conf = wombat['conf']
|
160
|
+
conf ||= {}
|
161
|
+
conf['key_dir'] ||= 'keys'
|
162
|
+
conf['cookbook_dir'] ||= 'cookbooks'
|
163
|
+
conf['packer_dir'] ||= 'packer'
|
164
|
+
conf['log_dir'] ||= 'logs'
|
165
|
+
conf['stack_dir'] ||= 'stacks'
|
166
|
+
conf['template_dir'] ||= 'templates'
|
167
|
+
conf['timeout'] ||= 7200
|
168
|
+
conf['audio'] ||= false
|
169
|
+
conf
|
149
170
|
end
|
150
171
|
|
151
|
-
def
|
152
|
-
|
172
|
+
def is_mac?
|
173
|
+
(/darwin/ =~ RUBY_PLATFORM) != nil
|
153
174
|
end
|
154
175
|
|
155
|
-
def
|
156
|
-
|
176
|
+
def audio?
|
177
|
+
is_mac? && conf['audio']
|
157
178
|
end
|
158
179
|
|
159
|
-
def
|
160
|
-
|
180
|
+
def logs
|
181
|
+
Dir.glob("#{conf['log_dir']}/#{cloud}*.log").reject { |l| !l.match(wombat['linux']) }
|
161
182
|
end
|
162
183
|
|
163
|
-
def
|
164
|
-
|
184
|
+
def calculate_templates
|
185
|
+
globs = "*.json"
|
186
|
+
Dir.chdir(conf['packer_dir']) do
|
187
|
+
Array(globs).
|
188
|
+
map { |glob| result = Dir.glob("#{glob}"); result.empty? ? glob : result }.
|
189
|
+
flatten.
|
190
|
+
sort.
|
191
|
+
delete_if { |file| file =~ /\.variables\./ }.
|
192
|
+
map { |template| template.sub(/\.json$/, '') }
|
193
|
+
end
|
165
194
|
end
|
166
195
|
|
167
|
-
def
|
168
|
-
|
169
|
-
|
196
|
+
def update_lock(cloud)
|
197
|
+
copy = {}
|
198
|
+
copy = wombat
|
199
|
+
region = copy[cloud]['region']
|
200
|
+
linux = copy['linux']
|
201
|
+
copy['amis'] = { region => {} }
|
170
202
|
|
171
|
-
|
172
|
-
|
203
|
+
if logs.length == 0
|
204
|
+
warn('No logs found - skipping lock update')
|
205
|
+
else
|
206
|
+
logs.each do |log|
|
207
|
+
case log
|
208
|
+
when /build-node/
|
209
|
+
copy['amis'][region]['build-node'] ||= {}
|
210
|
+
num = log.split('-')[3]
|
211
|
+
copy['amis'][region]['build-node'].store(num, parse_log(log, cloud))
|
212
|
+
when /workstation/
|
213
|
+
copy['amis'][region]['workstation'] ||= {}
|
214
|
+
num = log.split('-')[2]
|
215
|
+
copy['amis'][region]['workstation'].store(num, parse_log(log, cloud))
|
216
|
+
when /infranodes/
|
217
|
+
copy['amis'][region]['infranodes'] ||= {}
|
218
|
+
name = log.split('-')[2]
|
219
|
+
copy['amis'][region]['infranodes'].store(name, parse_log(log, cloud))
|
220
|
+
else
|
221
|
+
instance = log.match("#{cloud}-(.*)-(.*)\.log")[1]
|
222
|
+
copy['amis'][region].store(instance, parse_log(log, cloud))
|
223
|
+
end
|
224
|
+
end
|
225
|
+
copy['last_updated'] = Time.now.gmtime.strftime('%Y%m%d%H%M%S')
|
226
|
+
banner('Updating wombat.lock')
|
227
|
+
File.open('wombat.lock', 'w') do |f|
|
228
|
+
f.write(JSON.pretty_generate(copy))
|
229
|
+
end
|
230
|
+
end
|
173
231
|
end
|
174
232
|
|
175
|
-
def
|
176
|
-
|
233
|
+
def update_template(cloud)
|
234
|
+
if lock == 1
|
235
|
+
warn('No lock - skipping template creation')
|
236
|
+
else
|
237
|
+
region = lock['aws']['region']
|
238
|
+
@chef_server_ami = lock['amis'][region]['chef-server']
|
239
|
+
@automate_ami = lock['amis'][region]['automate']
|
240
|
+
@compliance_ami = lock['amis'][region]['compliance']
|
241
|
+
@build_nodes = lock['build-nodes']['count'].to_i
|
242
|
+
@build_node_ami = {}
|
243
|
+
1.upto(@build_nodes) do |i|
|
244
|
+
@build_node_ami[i] = lock['amis'][region]['build-node'][i.to_s]
|
245
|
+
end
|
246
|
+
@infra = {}
|
247
|
+
infranodes.each do |name, _rl|
|
248
|
+
@infra[name] = lock['amis'][region]['infranodes'][name]
|
249
|
+
end
|
250
|
+
@workstations = lock['workstations']['count'].to_i
|
251
|
+
@workstation_ami = {}
|
252
|
+
1.upto(@workstations) do |i|
|
253
|
+
@workstation_ami[i] = lock['amis'][region]['workstation'][i.to_s]
|
254
|
+
end
|
255
|
+
@availability_zone = lock['aws']['az']
|
256
|
+
@iam_roles = lock['aws']['iam_roles']
|
257
|
+
@demo = lock['name']
|
258
|
+
@version = lock['version']
|
259
|
+
@ttl = lock['ttl']
|
260
|
+
rendered_cfn = ERB.new(File.read("#{conf['template_dir']}/cfn.json.erb"), nil, '-').result(binding)
|
261
|
+
Dir.mkdir(conf['stack_dir'], 0755) unless File.exist?(conf['stack_dir'])
|
262
|
+
File.open("#{conf['stack_dir']}/#{@demo}.json", 'w') { |file| file.puts rendered_cfn }
|
263
|
+
banner("Generated: #{conf['stack_dir']}/#{@demo}.json")
|
264
|
+
end
|
177
265
|
end
|
178
266
|
end
|