knife-stackbuilder 0.5.5 → 0.5.6
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.
- checksums.yaml +4 -4
- data/lib/chef/knife/stack_build.rb +7 -6
- data/lib/chef/knife/stack_initialize_repo.rb +5 -5
- data/lib/stackbuilder/chef/repo.rb +19 -5
- data/lib/stackbuilder/chef/stack_container_node.rb +156 -0
- data/lib/stackbuilder/chef/stack_node_manager.rb +16 -8
- data/lib/stackbuilder/chef/stack_provider.rb +9 -4
- data/lib/stackbuilder/common/helpers.rb +7 -2
- data/lib/stackbuilder/resources/Berksfile.erb +6 -0
- data/lib/stackbuilder/resources/Config.yml.erb +4 -0
- data/lib/stackbuilder/resources/Environment.rb.erb +21 -0
- data/lib/stackbuilder/resources/Stack.yml.erb +44 -0
- data/lib/stackbuilder/resources/openssl.cnf +53 -0
- data/lib/stackbuilder/stack/node_manager.rb +5 -5
- data/lib/stackbuilder/stack/node_provider.rb +2 -2
- data/lib/stackbuilder/version.rb +1 -1
- data/lib/stackbuilder.rb +4 -0
- metadata +48 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 209a8ea8c3e0ab99bbe754f70003ed242e435052
|
4
|
+
data.tar.gz: 7e17e996e03499a4e9c7432ccd7354780d392b7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65bc78b0ed9f4ae0a8a27f95734f5c3b84632c6d39188d8e3025e692051f43b04e2dd973e485308e89be641b7aa4d28dc616bcc3d40cc8852fb231a571d6cfcc
|
7
|
+
data.tar.gz: d5b245863b3a171884b481668482de92bdddcb49d10a36bdbf1db48d00093237c520fe44c9318edffbc33742460adbcfde0ba73186f8ba2e877d49825113a15e
|
@@ -56,8 +56,11 @@ class Chef
|
|
56
56
|
repo_path = getConfig(:repo_path)
|
57
57
|
environment = getConfig(:environment) || '_default'
|
58
58
|
|
59
|
+
stack_id = getConfig(:stack_id) || ENV['STACK_ID']
|
60
|
+
stack_overrides = getConfig(:overrides) || ENV['STACK_OVERRIDES']
|
61
|
+
|
59
62
|
stack_file = name_args.first
|
60
|
-
if stack_file
|
63
|
+
if stack_file=~/^[-_+=.0-9a-zA-Z]+$/
|
61
64
|
stack_file = Dir.getwd + '/' + stack_file + (stack_file.end_with?('.yml') ? '' : '.yml')
|
62
65
|
end
|
63
66
|
unless File.exist?(stack_file)
|
@@ -78,9 +81,6 @@ class Chef
|
|
78
81
|
repo = StackBuilder::Chef::Repo.new(repo_path)
|
79
82
|
repo.upload_environments(environment)
|
80
83
|
|
81
|
-
stack_id = getConfig(:stack_id) || ENV['STACK_ID']
|
82
|
-
stack_overrides = getConfig(:overrides) || ENV['STACK_OVERRIDES']
|
83
|
-
|
84
84
|
stack = StackBuilder::Stack::Stack.new(
|
85
85
|
provider,
|
86
86
|
stack_file,
|
@@ -100,13 +100,14 @@ class Chef
|
|
100
100
|
end
|
101
101
|
|
102
102
|
stack.orchestrate(events, node_name, node_scale)
|
103
|
+
stack_id = stack.id
|
103
104
|
end
|
104
105
|
|
105
106
|
ensure
|
106
107
|
time_elapsed = Time.now - time_start
|
107
108
|
|
108
|
-
$stdout.printf( "\nStack build
|
109
|
-
stack_file, time_elapsed/60, time_elapsed%60 ) if !getConfig(:show_stack_file)
|
109
|
+
$stdout.printf( "\nStack '%s' build using the '%s' template took %d minutes and '%.3f' seconds\n",
|
110
|
+
stack_id, stack_file, time_elapsed/60, time_elapsed%60 ) if !getConfig(:show_stack_file)
|
110
111
|
end
|
111
112
|
end
|
112
113
|
|
@@ -12,13 +12,13 @@ class Chef
|
|
12
12
|
banner 'knife stack initialize repo (options)'
|
13
13
|
|
14
14
|
option :repo_path,
|
15
|
-
:long => "--
|
15
|
+
:long => "--repo-path REPO_PATH",
|
16
16
|
:description => "The path where a skeleton Chef Berkshelf repo will be created. " +
|
17
17
|
"If this is no provided the current working directory will be initialized.",
|
18
18
|
:default => '.'
|
19
19
|
|
20
20
|
option :cert_path,
|
21
|
-
:long => "--
|
21
|
+
:long => "--cert-path CERT_PATH",
|
22
22
|
:description => "Path containing folders with server certificates. Each folder " +
|
23
23
|
"within this path should be named after the server for which the certs are " +
|
24
24
|
"meant post-fixed by _{ENV_NAME}. If name is not post-fixed then the cert " +
|
@@ -29,8 +29,8 @@ class Chef
|
|
29
29
|
:description => "Comma separated list of server names for which self-signed " +
|
30
30
|
"certificates will be generated."
|
31
31
|
|
32
|
-
option :
|
33
|
-
:long => "--
|
32
|
+
option :stack_environments,
|
33
|
+
:long => "--stack-environments ENVIRONMENTS",
|
34
34
|
:description => "Comma separated list of environments to generate"
|
35
35
|
|
36
36
|
option :cookbooks,
|
@@ -53,7 +53,7 @@ class Chef
|
|
53
53
|
StackBuilder::Chef::Repo.new(
|
54
54
|
getConfig(:repo_path),
|
55
55
|
cert_path.nil? ? certs : cert_path,
|
56
|
-
getConfig(:
|
56
|
+
getConfig(:stack_environments),
|
57
57
|
getConfig(:cookbooks) )
|
58
58
|
end
|
59
59
|
end
|
@@ -79,8 +79,9 @@ module StackBuilder::Chef
|
|
79
79
|
envfile = ERB.new(envfile_template, nil, '-<>').result(binding)
|
80
80
|
File.open("#{@repo_path}/environments/#{env_name}.rb", 'w+') { |f| f.write(envfile) }
|
81
81
|
|
82
|
+
@stack_name = 'stack' + i.to_s
|
82
83
|
stackfile = ERB.new(stackfile_template, nil, '-<>').result(binding)
|
83
|
-
File.open("#{@repo_path}
|
84
|
+
File.open("#{@repo_path}/#{@stack_name}.yml", 'w+') { |f| f.write(stackfile) }
|
84
85
|
i += 1
|
85
86
|
end
|
86
87
|
@environment = nil
|
@@ -99,7 +100,10 @@ module StackBuilder::Chef
|
|
99
100
|
|
100
101
|
# TODO: Handle JSON environment files. JSON files should be processed similar to roles.
|
101
102
|
|
102
|
-
|
103
|
+
env_file = "#{@repo_path}/environments/#{env_name}.rb"
|
104
|
+
FileUtils.touch(env_file)
|
105
|
+
|
106
|
+
knife_cmd.name_args = [ env_file ]
|
103
107
|
run_knife(knife_cmd)
|
104
108
|
puts "Uploaded environment '#{env_name}' to '#{Chef::Config.chef_server_url}'."
|
105
109
|
end
|
@@ -138,10 +142,12 @@ module StackBuilder::Chef
|
|
138
142
|
|
139
143
|
environments = (environment.nil? ? @environments : [ environment ])
|
140
144
|
environments.each do |env_name|
|
145
|
+
FileUtils.touch("#{@repo_path}/environments/#{env_name}.rb")
|
141
146
|
upload_certificate(server_cert_dir, server_name, env_name)
|
142
147
|
end
|
143
148
|
|
144
149
|
elsif environment.nil? || environment==server_env_name
|
150
|
+
FileUtils.touch("#{@repo_path}/environments/#{server_env_name}.rb")
|
145
151
|
upload_certificate(server_cert_dir, server_name, server_env_name)
|
146
152
|
end
|
147
153
|
end
|
@@ -163,6 +169,8 @@ module StackBuilder::Chef
|
|
163
169
|
|
164
170
|
environments.each do |env_name|
|
165
171
|
|
172
|
+
FileUtils.touch("#{@repo_path}/environments/#{env_name}.rb")
|
173
|
+
|
166
174
|
data_bag_env = data_bag_name + '-' + env_name
|
167
175
|
unless data_bag_list.include?(data_bag_env)
|
168
176
|
knife_cmd = Chef::Knife::DataBagCreate.new
|
@@ -190,6 +198,8 @@ module StackBuilder::Chef
|
|
190
198
|
berksfile_path = "#{@repo_path}/Berksfile"
|
191
199
|
debug_flag = (@logger.debug? ? ' --debug' : '')
|
192
200
|
|
201
|
+
FileUtils.touch(Dir.glob("#{@repo_path}/environments/*.rb"))
|
202
|
+
|
193
203
|
# Need to invoke Berkshelf from the shell as directly invoking it causes
|
194
204
|
# cookbook validation to throw an exception when 'Berksfile.upload' is
|
195
205
|
# called.
|
@@ -213,6 +223,8 @@ module StackBuilder::Chef
|
|
213
223
|
|
214
224
|
def upload_roles(role = nil)
|
215
225
|
|
226
|
+
FileUtils.touch(Dir.glob("#{@repo_path}/environments/*.rb"))
|
227
|
+
|
216
228
|
if role.nil?
|
217
229
|
Dir["#{@repo_path}/roles/*.json"].each do |role_file|
|
218
230
|
upload_role(role_file)
|
@@ -374,7 +386,8 @@ module StackBuilder::Chef
|
|
374
386
|
|
375
387
|
knife_cmd = Chef::Knife::DataBagFromFile.new
|
376
388
|
knife_cmd.name_args = [ data_bag_name, tmpfile ]
|
377
|
-
knife_cmd.config[:
|
389
|
+
knife_cmd.config[:encrypt] = true
|
390
|
+
Chef::Config[:knife][:secret] = get_secret(server_env_name)
|
378
391
|
run_knife(knife_cmd)
|
379
392
|
|
380
393
|
puts "Uploaded '#{server_env_name}' certificate for server '#{server_name}' " +
|
@@ -402,7 +415,8 @@ module StackBuilder::Chef
|
|
402
415
|
|
403
416
|
knife_cmd = Chef::Knife::DataBagFromFile.new
|
404
417
|
knife_cmd.name_args = [ data_bag_name, tmpfile ]
|
405
|
-
knife_cmd.config[:
|
418
|
+
knife_cmd.config[:encrypt] = true
|
419
|
+
Chef::Config[:knife][:secret] = secret
|
406
420
|
run_knife(knife_cmd)
|
407
421
|
|
408
422
|
File.delete(tmpfile)
|
@@ -419,7 +433,7 @@ module StackBuilder::Chef
|
|
419
433
|
|
420
434
|
def upload_role(role_file)
|
421
435
|
|
422
|
-
role_content = eval_map_values(JSON.load(File.new(role_file, 'r')), ENV)
|
436
|
+
role_content = eval_map_values(JSON.load(File.new(role_file, 'r')).to_hash, ENV.to_hash)
|
423
437
|
|
424
438
|
role_name = role_content.is_a?(Chef::Role) ? role_content.name : role_content['name']
|
425
439
|
@logger.debug("Uploading role '#{role_name}' with contents:\n#{role_content.to_yaml}")
|
@@ -0,0 +1,156 @@
|
|
1
|
+
# Copyright (c) 2014 Mevan Samaratunga
|
2
|
+
|
3
|
+
include StackBuilder::Common::Helpers
|
4
|
+
|
5
|
+
module StackBuilder::Chef
|
6
|
+
|
7
|
+
class ContainerNodeManager < StackBuilder::Chef::NodeManager
|
8
|
+
|
9
|
+
def initialize(id, node_config, repo_path, environment)
|
10
|
+
|
11
|
+
super(id, node_config, repo_path, environment)
|
12
|
+
|
13
|
+
@env_file_path = repo_path + '/environments/' + environment + '.rb'
|
14
|
+
|
15
|
+
docker_image_dir = repo_path + '/.docker_images'
|
16
|
+
FileUtils.mkdir_p(docker_image_dir)
|
17
|
+
@docker_image_path = docker_image_dir + '/' + @name + '.gz'
|
18
|
+
end
|
19
|
+
|
20
|
+
def process(index, events, attributes, target = nil)
|
21
|
+
|
22
|
+
@@sync ||= Mutex.new
|
23
|
+
@@sync.synchronize {
|
24
|
+
|
25
|
+
unless @build_complete ||
|
26
|
+
(File.exist?(@docker_image_path) && File.exist?(@env_file_path) && \
|
27
|
+
File.mtime(@docker_image_path) > File.mtime(@env_file_path) )
|
28
|
+
|
29
|
+
if is_os_x? || !is_nix_os?
|
30
|
+
|
31
|
+
raise ArgumentError, "DOCKER_HOST environment variable not set." \
|
32
|
+
unless ENV['DOCKER_HOST']
|
33
|
+
raise ArgumentError, "DOCKER_CERT_PATH environment variable not set." \
|
34
|
+
unless ENV['DOCKER_CERT_PATH']
|
35
|
+
raise ArgumentError, "DOCKER_TLS_VERIFY environment variable not set." \
|
36
|
+
unless ENV['DOCKER_TLS_VERIFY']
|
37
|
+
end
|
38
|
+
|
39
|
+
begin
|
40
|
+
build_role = Chef::Role.new
|
41
|
+
build_role.name(@name + '_build')
|
42
|
+
build_role.override_attributes(attributes)
|
43
|
+
build_role.save
|
44
|
+
|
45
|
+
dockerfiles_path = File.join(Dir.home, '/.knife/container')
|
46
|
+
|
47
|
+
build_exists = @name==`docker images | awk '/#{@name}/ { print $1 }'`.strip
|
48
|
+
|
49
|
+
knife_cmd = Chef::Knife::ContainerDockerInit.new
|
50
|
+
knife_cmd.name_args = [ @name ]
|
51
|
+
|
52
|
+
knife_cmd.config[:local_mode] = false
|
53
|
+
knife_cmd.config[:base_image] = build_exists ? @name : @knife_config['image']
|
54
|
+
knife_cmd.config[:force] = true
|
55
|
+
knife_cmd.config[:generate_berksfile] = false
|
56
|
+
knife_cmd.config[:include_credentials] = false
|
57
|
+
|
58
|
+
knife_cmd.config[:dockerfiles_path] = dockerfiles_path
|
59
|
+
knife_cmd.config[:run_list] = @knife_config['run_list'] + [ "role[#{build_role.name}]" ]
|
60
|
+
|
61
|
+
knife_cmd.config[:encrypted_data_bag_secret] = IO.read(@env_key_file) \
|
62
|
+
unless File.exist? (@env_key_file)
|
63
|
+
|
64
|
+
run_knife(knife_cmd)
|
65
|
+
|
66
|
+
if @knife_config.has_key?('inline_dockerfile')
|
67
|
+
|
68
|
+
dockerfile_path = dockerfiles_path + "/#{@name}/Dockerfile"
|
69
|
+
docker_file = IO.read(dockerfile_path).lines
|
70
|
+
|
71
|
+
docker_file_new = [ ]
|
72
|
+
while docker_file.size>0
|
73
|
+
l = docker_file.delete_at(0)
|
74
|
+
docker_file_new << l
|
75
|
+
if l.start_with?('FROM ')
|
76
|
+
docker_file_new += @knife_config['inline_dockerfile'].lines.map { |ll| ll.strip + "\n" }
|
77
|
+
break
|
78
|
+
end
|
79
|
+
end
|
80
|
+
docker_file_new += docker_file
|
81
|
+
|
82
|
+
File.open(dockerfile_path, 'w+') { |f| f.write(docker_file_new.join) }
|
83
|
+
end
|
84
|
+
|
85
|
+
knife_cmd = Chef::Knife::ContainerDockerBuild.new
|
86
|
+
knife_cmd.name_args = [ @name ]
|
87
|
+
|
88
|
+
knife_cmd.config[:run_berks] = false
|
89
|
+
knife_cmd.config[:force_build] = true
|
90
|
+
knife_cmd.config[:dockerfiles_path] = dockerfiles_path
|
91
|
+
knife_cmd.config[:cleanup] = true
|
92
|
+
|
93
|
+
result = run_knife(knife_cmd)
|
94
|
+
|
95
|
+
ensure
|
96
|
+
build_role.destroy unless build_role.nil?
|
97
|
+
end
|
98
|
+
|
99
|
+
# TODO: Errors are currently not detected as knife-container sends all chef-client output to stdout
|
100
|
+
if result.rindex('Chef run process exited unsuccessfully (exit code 1)')
|
101
|
+
|
102
|
+
if @logger.level>=::Logger::WARN
|
103
|
+
puts "Knife execution failed with an error."
|
104
|
+
puts "#{result.string}"
|
105
|
+
end
|
106
|
+
|
107
|
+
`for i in $(docker ps -a | awk '/chef-in/ { print $1 }'); do docker rm -f $i; done`
|
108
|
+
`for i in $(docker images | awk '/<none>/ { print $3 }'); do docker rmi $i; done`
|
109
|
+
|
110
|
+
raise StackBuilderError, 'Container build has errors.'
|
111
|
+
end
|
112
|
+
|
113
|
+
`docker save #{@name} | gzip -9 > #{@docker_image_path}`
|
114
|
+
end
|
115
|
+
@build_complete = true
|
116
|
+
}
|
117
|
+
|
118
|
+
if @build_complete && !target.nil?
|
119
|
+
|
120
|
+
node = Chef::Node.load("#{target.node_id}-#{index}")
|
121
|
+
ipaddress = node.attributes['ipaddress']
|
122
|
+
|
123
|
+
if target.ssh_password.nil?
|
124
|
+
ssh = Net::SSH.start(ipaddress, target.ssh_user,
|
125
|
+
{
|
126
|
+
:key_data => IO.read(target.ssh_identity_file),
|
127
|
+
:user_known_hosts_file => "/dev/null"
|
128
|
+
} )
|
129
|
+
else
|
130
|
+
ssh = Net::SSH.start(ipaddress, target.ssh_user,
|
131
|
+
{
|
132
|
+
:password => target.ssh_password,
|
133
|
+
:user_known_hosts_file => "/dev/null"
|
134
|
+
} )
|
135
|
+
end
|
136
|
+
|
137
|
+
ssh.open_channel do |channel|
|
138
|
+
|
139
|
+
channel.exec('gunzip | sudo docker load') do |ch, success|
|
140
|
+
channel.on_data do |ch, data|
|
141
|
+
res << data
|
142
|
+
end
|
143
|
+
|
144
|
+
channel.send_data IO.binread(@docker_image_path)
|
145
|
+
channel.eof!
|
146
|
+
end
|
147
|
+
end
|
148
|
+
ssh.loop
|
149
|
+
end
|
150
|
+
|
151
|
+
super(index, events, attributes, target)
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
end
|
156
|
+
end
|
@@ -9,10 +9,15 @@ module StackBuilder::Chef
|
|
9
9
|
include ERB::Util
|
10
10
|
|
11
11
|
attr_accessor :name
|
12
|
+
attr_accessor :node_id
|
12
13
|
|
13
14
|
attr_accessor :run_list
|
14
15
|
attr_accessor :run_on_event
|
15
16
|
|
17
|
+
attr_accessor :ssh_user
|
18
|
+
attr_accessor :ssh_password
|
19
|
+
attr_accessor :ssh_identity_file
|
20
|
+
|
16
21
|
def initialize(id, node_config, repo_path, environment)
|
17
22
|
|
18
23
|
@logger = StackBuilder::Common::Config.logger
|
@@ -25,7 +30,7 @@ module StackBuilder::Chef
|
|
25
30
|
@run_on_event = node_config['run_on_event']
|
26
31
|
|
27
32
|
@knife_config = node_config['knife']
|
28
|
-
if @knife_config
|
33
|
+
if @knife_config && @knife_config.has_key?('options')
|
29
34
|
|
30
35
|
raise ArgumentError, 'An ssh user needs to be provided for bootstrap and knife ssh.' \
|
31
36
|
unless @knife_config['options'].has_key?('ssh_user')
|
@@ -36,11 +41,12 @@ module StackBuilder::Chef
|
|
36
41
|
|
37
42
|
@ssh_user = @knife_config['options']['ssh_user']
|
38
43
|
@ssh_password = @knife_config['options']['ssh_password']
|
39
|
-
@
|
40
|
-
|
41
|
-
@env_key_file = "#{repo_path}/secrets/#{environment}"
|
42
|
-
@env_key_file = nil unless File.exist?(@env_key_file)
|
44
|
+
@ssh_identity_file = @knife_config['options']['identity_file']
|
45
|
+
@ssh_identity_file.gsub!(/~\//, Dir.home + '/') unless @ssh_identity_file.nil?
|
43
46
|
end
|
47
|
+
|
48
|
+
@env_key_file = "#{repo_path}/secrets/#{environment}"
|
49
|
+
@env_key_file = nil unless File.exist?(@env_key_file)
|
44
50
|
end
|
45
51
|
|
46
52
|
def get_name
|
@@ -73,7 +79,9 @@ module StackBuilder::Chef
|
|
73
79
|
|
74
80
|
unless @env_key_file.nil?
|
75
81
|
env_key = IO.read(@env_key_file)
|
76
|
-
knife_ssh(name,
|
82
|
+
knife_ssh( name,
|
83
|
+
"echo '#{env_key}' > /etc/chef/encrypted_data_bag_secret\n" +
|
84
|
+
"chmod 0600 /etc/chef/encrypted_data_bag_secret" )
|
77
85
|
end
|
78
86
|
|
79
87
|
rescue Exception => msg
|
@@ -84,7 +92,7 @@ module StackBuilder::Chef
|
|
84
92
|
end
|
85
93
|
|
86
94
|
def create_vm(name, knife_config)
|
87
|
-
raise NotImplemented, 'HostNodeManager.create_vm'
|
95
|
+
raise StackBuilder::Common::NotImplemented, 'HostNodeManager.create_vm'
|
88
96
|
end
|
89
97
|
|
90
98
|
def process(index, events, attributes, target = nil)
|
@@ -172,7 +180,7 @@ module StackBuilder::Chef
|
|
172
180
|
end
|
173
181
|
|
174
182
|
def delete_vm(name, knife_config)
|
175
|
-
raise NotImplemented, 'HostNodeManager.delete_vm'
|
183
|
+
raise StackBuilder::Common::NotImplemented, 'HostNodeManager.delete_vm'
|
176
184
|
end
|
177
185
|
|
178
186
|
def config_knife(knife_cmd, options)
|
@@ -13,6 +13,9 @@ module StackBuilder::Chef
|
|
13
13
|
@repo_path = File.expand_path(repo_path)
|
14
14
|
@environment = environment
|
15
15
|
|
16
|
+
Chef::Config[:environment] = @environment
|
17
|
+
Chef::Config[:environment_path] = @repo_path + '/environments'
|
18
|
+
|
16
19
|
env_file = "#{@repo_path}/etc/#{@environment}.yml"
|
17
20
|
if File.exist?(env_file)
|
18
21
|
|
@@ -37,9 +40,6 @@ module StackBuilder::Chef
|
|
37
40
|
raise ArgmentError, "Stack file is fixed to the environment '#{stack_environment}', " +
|
38
41
|
" which it does not match the environment '#{@environment}' provided." \
|
39
42
|
unless stack_environment.nil? || stack_environment==@environment
|
40
|
-
|
41
|
-
Chef::Config[:chef_server_url] = stack['chef_server_url'] if stack.has_key?('chef_server_url')
|
42
|
-
Chef::Config[:environment] = @environment
|
43
43
|
end
|
44
44
|
|
45
45
|
def get_env_vars
|
@@ -57,7 +57,12 @@ module StackBuilder::Chef
|
|
57
57
|
|
58
58
|
case knife_config['plugin']
|
59
59
|
when 'vagrant'
|
60
|
-
return StackBuilder::Chef::VagrantNodeManager.new(
|
60
|
+
return StackBuilder::Chef::VagrantNodeManager.new(
|
61
|
+
@id, node_config, @repo_path, @environment)
|
62
|
+
|
63
|
+
when 'container'
|
64
|
+
return StackBuilder::Chef::ContainerNodeManager.new(
|
65
|
+
@id, node_config, @repo_path, @environment)
|
61
66
|
|
62
67
|
# TODO: Refactor so that managers are pluggable from other gems
|
63
68
|
|
@@ -7,8 +7,13 @@ module StackBuilder::Common
|
|
7
7
|
#
|
8
8
|
# Returns whether platform is a nix OS
|
9
9
|
#
|
10
|
-
def is_nix_os
|
11
|
-
|
10
|
+
def is_nix_os?
|
11
|
+
RbConfig::CONFIG["host_os"] =~ /linux|freebsd|darwin|unix/
|
12
|
+
end
|
13
|
+
|
14
|
+
# Return whether platform is a OS X
|
15
|
+
def is_os_x?
|
16
|
+
RbConfig::CONFIG["host_os"] =~ /darwin/
|
12
17
|
end
|
13
18
|
|
14
19
|
#
|
@@ -0,0 +1,21 @@
|
|
1
|
+
name "<%= @environment %>"
|
2
|
+
description "Chef '<%= @environment %>' environment."
|
3
|
+
|
4
|
+
env = YAML.load_file(File.expand_path('../../etc/<%= @environment %>.yml', __FILE__))
|
5
|
+
|
6
|
+
override_attributes(
|
7
|
+
|
8
|
+
# Add attributes here as ruby map
|
9
|
+
#
|
10
|
+
# "attr" => {
|
11
|
+
# "key" => ..
|
12
|
+
# ...
|
13
|
+
# }
|
14
|
+
# ...
|
15
|
+
#
|
16
|
+
# Use this ruby template to load externalized variables from a yaml file
|
17
|
+
|
18
|
+
'attr' => {
|
19
|
+
'key' => "#{env['key']}"
|
20
|
+
}
|
21
|
+
)
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Stack
|
2
|
+
name: <%= @stack_name %>
|
3
|
+
environment: <%= @environment %>
|
4
|
+
|
5
|
+
# Knife bootstrap and ssh attributes. The plugin attribute
|
6
|
+
# is used to determine which knife plugin to use for node
|
7
|
+
# creation. If a plugin is not provided it would be assumed
|
8
|
+
# that the host exists.
|
9
|
+
knife: &knife
|
10
|
+
plugin: vagrant
|
11
|
+
options:
|
12
|
+
box: chef/ubuntu-14.04
|
13
|
+
box_url: https://vagrantcloud.com/chef/boxes/ubuntu-14.04
|
14
|
+
# Vagrant sets up a NAT for the VM. We need to setup a host
|
15
|
+
# only network so the vm can talk to chef zero on host.
|
16
|
+
subnet: 192.168.50.0/24
|
17
|
+
identity_file: ~/.vagrant/insecure_key
|
18
|
+
ssh_user: vagrant
|
19
|
+
sudo: true
|
20
|
+
# inline config to use vagrant-ohai plugin to install ohai
|
21
|
+
# plugin to capture ip from eth1 instead of eth0 as well
|
22
|
+
# as run an apt update.
|
23
|
+
inline_config: |
|
24
|
+
config.ohai.enable = true
|
25
|
+
config.ohai.primary_nic = "eth1"
|
26
|
+
config.vm.provision "shell", inline: "mkdir -p /etc/chef"
|
27
|
+
config.vm.provision "shell", inline: "apt-get update"
|
28
|
+
# bootstrap run-list. This will be replaced
|
29
|
+
# if a node run list is provided. We run the
|
30
|
+
# ohai cookbook to ensure that the node's
|
31
|
+
# ipaddress is populated with the address
|
32
|
+
# of eth1 and not the default eth0
|
33
|
+
run_list:
|
34
|
+
- recipe[ohai]
|
35
|
+
|
36
|
+
stack:
|
37
|
+
|
38
|
+
- node: <%= @stack_name %>-node
|
39
|
+
knife: *knife
|
40
|
+
run_list:
|
41
|
+
<% @berks_cookbooks.each do |cookbook| -%>
|
42
|
+
- recipe[ohai]
|
43
|
+
- recipe[<%= cookbook[0] %>]
|
44
|
+
<% end -%>
|
@@ -0,0 +1,53 @@
|
|
1
|
+
[ ca ]
|
2
|
+
default_ca = testca
|
3
|
+
|
4
|
+
[ testca ]
|
5
|
+
dir = .
|
6
|
+
certificate = $dir/cacert.pem
|
7
|
+
database = $dir/index.txt
|
8
|
+
new_certs_dir = $dir/certs
|
9
|
+
private_key = $dir/private/cakey.pem
|
10
|
+
serial = $dir/serial
|
11
|
+
|
12
|
+
default_crl_days = 7
|
13
|
+
default_days = 365
|
14
|
+
default_md = sha1
|
15
|
+
|
16
|
+
policy = testca_policy
|
17
|
+
x509_extensions = certificate_extensions
|
18
|
+
|
19
|
+
[ testca_policy ]
|
20
|
+
commonName = supplied
|
21
|
+
stateOrProvinceName = optional
|
22
|
+
countryName = optional
|
23
|
+
emailAddress = optional
|
24
|
+
organizationName = optional
|
25
|
+
organizationalUnitName = optional
|
26
|
+
|
27
|
+
[ certificate_extensions ]
|
28
|
+
basicConstraints = CA:false
|
29
|
+
|
30
|
+
[ req ]
|
31
|
+
default_bits = 2048
|
32
|
+
default_keyfile = ./private/cakey.pem
|
33
|
+
default_md = sha1
|
34
|
+
prompt = yes
|
35
|
+
distinguished_name = root_ca_distinguished_name
|
36
|
+
x509_extensions = root_ca_extensions
|
37
|
+
|
38
|
+
[ root_ca_distinguished_name ]
|
39
|
+
commonName = hostname
|
40
|
+
|
41
|
+
[ root_ca_extensions ]
|
42
|
+
basicConstraints = CA:true
|
43
|
+
keyUsage = keyCertSign, cRLSign
|
44
|
+
|
45
|
+
[ client_ca_extensions ]
|
46
|
+
basicConstraints = CA:false
|
47
|
+
keyUsage = digitalSignature
|
48
|
+
extendedKeyUsage = 1.3.6.1.5.5.7.3.2
|
49
|
+
|
50
|
+
[ server_ca_extensions ]
|
51
|
+
basicConstraints = CA:false
|
52
|
+
keyUsage = keyEncipherment
|
53
|
+
extendedKeyUsage = 1.3.6.1.5.5.7.3.1
|
@@ -7,7 +7,7 @@ module StackBuilder::Stack
|
|
7
7
|
class NodeManager
|
8
8
|
|
9
9
|
def get_name
|
10
|
-
raise NotImplemented, 'NodeManager.get_name'
|
10
|
+
raise StackBuilder::Common::NotImplemented, 'NodeManager.get_name'
|
11
11
|
end
|
12
12
|
|
13
13
|
def get_scale
|
@@ -19,19 +19,19 @@ module StackBuilder::Stack
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def node_attributes
|
22
|
-
raise NotImplemented, 'NodeManager.node_attributes'
|
22
|
+
raise StackBuilder::Common::NotImplemented, 'NodeManager.node_attributes'
|
23
23
|
end
|
24
24
|
|
25
25
|
def create(index)
|
26
|
-
raise NotImplemented, 'NodeManager.create'
|
26
|
+
raise StackBuilder::Common::NotImplemented, 'NodeManager.create'
|
27
27
|
end
|
28
28
|
|
29
29
|
def process(index, events, attributes, target = nil)
|
30
|
-
raise NotImplemented, 'NodeManager.process'
|
30
|
+
raise StackBuilder::Common::NotImplemented, 'NodeManager.process'
|
31
31
|
end
|
32
32
|
|
33
33
|
def delete(index)
|
34
|
-
raise NotImplemented, 'NodeManager.delete'
|
34
|
+
raise StackBuilder::Common::NotImplemented, 'NodeManager.delete'
|
35
35
|
end
|
36
36
|
|
37
37
|
end
|
@@ -7,7 +7,7 @@ module StackBuilder::Stack
|
|
7
7
|
class NodeProvider
|
8
8
|
|
9
9
|
def set_stack(stack, id)
|
10
|
-
raise NotImplemented, 'NodeProvider.set_stack_id'
|
10
|
+
raise StackBuilder::Common::NotImplemented, 'NodeProvider.set_stack_id'
|
11
11
|
end
|
12
12
|
|
13
13
|
def get_env_vars
|
@@ -15,7 +15,7 @@ module StackBuilder::Stack
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def get_node_manager(node_config)
|
18
|
-
raise NotImplemented, 'NodeProvider.get_node_manager'
|
18
|
+
raise StackBuilder::Common::NotImplemented, 'NodeProvider.get_node_manager'
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
data/lib/stackbuilder/version.rb
CHANGED
data/lib/stackbuilder.rb
CHANGED
@@ -10,6 +10,7 @@ require 'erb'
|
|
10
10
|
require 'securerandom'
|
11
11
|
require 'fileutils'
|
12
12
|
require 'tmpdir'
|
13
|
+
require 'tempfile'
|
13
14
|
require "stringio"
|
14
15
|
require 'json'
|
15
16
|
require 'openssl'
|
@@ -36,6 +37,8 @@ require 'chef/knife/attribute'
|
|
36
37
|
require 'chef/knife/vagrant_server_create'
|
37
38
|
require 'chef/knife/vagrant_server_delete'
|
38
39
|
require 'chef/knife/vagrant_server_list'
|
40
|
+
require 'chef/knife/container_docker_init'
|
41
|
+
require 'chef/knife/container_docker_build'
|
39
42
|
|
40
43
|
require 'stackbuilder/common/config'
|
41
44
|
require 'stackbuilder/common/errors'
|
@@ -51,3 +54,4 @@ require 'stackbuilder/chef/stack_provider'
|
|
51
54
|
require 'stackbuilder/chef/stack_node_manager'
|
52
55
|
require 'stackbuilder/chef/stack_vagrant_node'
|
53
56
|
require 'stackbuilder/chef/stack_generic_node'
|
57
|
+
require 'stackbuilder/chef/stack_container_node'
|
metadata
CHANGED
@@ -1,57 +1,85 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knife-stackbuilder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mevan Samaratunga
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chef
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: '12'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: '12'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: knife-attribute
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: knife-container
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
32
46
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
47
|
+
version: '0'
|
34
48
|
type: :runtime
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
|
-
- -
|
52
|
+
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: knife-vagrant3
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: highline
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
44
72
|
requirements:
|
45
|
-
- - "
|
73
|
+
- - ">="
|
46
74
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
75
|
+
version: '0'
|
48
76
|
type: :runtime
|
49
77
|
prerelease: false
|
50
78
|
version_requirements: !ruby/object:Gem::Requirement
|
51
79
|
requirements:
|
52
|
-
- - "
|
80
|
+
- - ">="
|
53
81
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
82
|
+
version: '0'
|
55
83
|
description: Knife Stackbuilder plugin
|
56
84
|
email: mevansam@gmail.com
|
57
85
|
executables:
|
@@ -74,6 +102,7 @@ files:
|
|
74
102
|
- lib/chef/knife/stackbuilder_base.rb
|
75
103
|
- lib/stackbuilder.rb
|
76
104
|
- lib/stackbuilder/chef/repo.rb
|
105
|
+
- lib/stackbuilder/chef/stack_container_node.rb
|
77
106
|
- lib/stackbuilder/chef/stack_generic_node.rb
|
78
107
|
- lib/stackbuilder/chef/stack_node_manager.rb
|
79
108
|
- lib/stackbuilder/chef/stack_provider.rb
|
@@ -83,6 +112,11 @@ files:
|
|
83
112
|
- lib/stackbuilder/common/helpers.rb
|
84
113
|
- lib/stackbuilder/common/semaphore.rb
|
85
114
|
- lib/stackbuilder/common/teeio.rb
|
115
|
+
- lib/stackbuilder/resources/Berksfile.erb
|
116
|
+
- lib/stackbuilder/resources/Config.yml.erb
|
117
|
+
- lib/stackbuilder/resources/Environment.rb.erb
|
118
|
+
- lib/stackbuilder/resources/Stack.yml.erb
|
119
|
+
- lib/stackbuilder/resources/openssl.cnf
|
86
120
|
- lib/stackbuilder/stack/node_manager.rb
|
87
121
|
- lib/stackbuilder/stack/node_provider.rb
|
88
122
|
- lib/stackbuilder/stack/node_task.rb
|