dev-lxc 2.3.3 → 2.4.0
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/CHANGELOG.md +10 -0
- data/docs/configuration.md +6 -2
- data/docs/prerequisites.md +3 -1
- data/lib/dev-lxc.rb +1 -1
- data/lib/dev-lxc/cli.rb +5 -1
- data/lib/dev-lxc/cluster.rb +66 -9
- data/lib/dev-lxc/server.rb +19 -18
- data/lib/dev-lxc/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c4d56770910d2c693b886f65c3b233d8aeca752a
|
4
|
+
data.tar.gz: b0e22969f25e6e3def0807322f5041ca51482bb8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b216fc333e7b71c654ae83ee247169be68cdb75dd072bb72f2e0bcf5e1a8f4fa66d1ebfcb26647ac80af92720d352c7cd6d880fd5f9560ba94c913b229b02946
|
7
|
+
data.tar.gz: 2520dc769f5320ec1fecf416ad0b223d0553c0f1b44591288e5efac1e860e0258534ddd0097d1bbd71a4d0ae824f98bab8e9b21db7caf44654693b04d5be64da
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# dev-lxc Change Log
|
2
2
|
|
3
|
+
## 2.4.0 (2017-02-03)
|
4
|
+
|
5
|
+
* Refactor DHCP address management
|
6
|
+
* Add enable_build_snapshots config option
|
7
|
+
* Skip abort test if server exists AND "build: completed" snapshot exists
|
8
|
+
* Add auto-integration of Compliance and standalone Chef Server
|
9
|
+
* Remove period from sha256sum error message
|
10
|
+
* Reword message when base container already exists
|
11
|
+
* Update prerequisites.md
|
12
|
+
|
3
13
|
## 2.3.3 (2016-12-19)
|
4
14
|
|
5
15
|
* Remove debug output from "dpkg -i"
|
data/docs/configuration.md
CHANGED
@@ -14,6 +14,10 @@ dev-lxc init --chef --automate --supermarket --runners --nodes > dev-lxc.yml
|
|
14
14
|
The contents of `dev-lxc.yml` should look like this.
|
15
15
|
|
16
16
|
```
|
17
|
+
# enable_build_snapshots automatically makes container snapshots at key times during the build process
|
18
|
+
# default value is `true`
|
19
|
+
#enable_build_snapshots: true
|
20
|
+
|
17
21
|
# base_container must be the name of an existing container
|
18
22
|
base_container: b-ubuntu-1404
|
19
23
|
|
@@ -92,7 +96,7 @@ As you can see there are four server types represented by five servers.
|
|
92
96
|
|
93
97
|
#### Global Settings
|
94
98
|
|
95
|
-
The global settings used by each of the server types are the `base_container`, a list of `mounts` and
|
99
|
+
The global settings used by each of the server types are `enable_build_snapshots`, the `base_container`, a list of `mounts` and
|
96
100
|
a list of `ssh-keys`. These settings are described in the config comments.
|
97
101
|
|
98
102
|
Be sure to set `base_container` in the `dev-lxc.yml` to an existing container's name.
|
@@ -102,7 +106,7 @@ If you don't already have a container to use as a `base_container` then you can
|
|
102
106
|
|
103
107
|
#### Server Specific Settings
|
104
108
|
|
105
|
-
It is possible to define different values for `base_container`, `mounts` or `ssh-keys` for a particular server type or even for a particular server as you can see in the following snippet.
|
109
|
+
It is possible to define different values for `enable_build_snapshots`, `base_container`, `mounts` or `ssh-keys` for a particular server type or even for a particular server as you can see in the following snippet.
|
106
110
|
|
107
111
|
```
|
108
112
|
nodes:
|
data/docs/prerequisites.md
CHANGED
@@ -11,7 +11,9 @@ Install the vagrant-persistent-storage plugin.
|
|
11
11
|
vagrant plugin install vagrant-persistent-storage
|
12
12
|
```
|
13
13
|
|
14
|
-
Download and install [ChefDK](http://downloads.chef.io/
|
14
|
+
Download and install [ChefDK](http://downloads.chef.io/).
|
15
|
+
|
16
|
+
Run `chef shell-init` to read its usage docs. Then run the appropriate command for your shell.
|
15
17
|
|
16
18
|
#### Download dev-lxc-platform
|
17
19
|
|
data/lib/dev-lxc.rb
CHANGED
@@ -9,7 +9,7 @@ module DevLXC
|
|
9
9
|
def self.create_base_container(base_container_name, base_container_options)
|
10
10
|
base_container = DevLXC::Container.new(base_container_name)
|
11
11
|
if base_container.defined?
|
12
|
-
puts "
|
12
|
+
puts "Base container '#{base_container.name}' already exists"
|
13
13
|
return base_container
|
14
14
|
end
|
15
15
|
puts "Creating base container '#{base_container.name}'"
|
data/lib/dev-lxc/cli.rb
CHANGED
@@ -60,7 +60,11 @@ module DevLXC::CLI
|
|
60
60
|
option :append, :aliases => "-a", :type => :boolean, :desc => "Do not generate the global config header"
|
61
61
|
option :filename, :aliases => "-f", :desc => "Write generated content to FILE rather than standard output."
|
62
62
|
def init
|
63
|
-
header = %Q(#
|
63
|
+
header = %Q(# enable_build_snapshots automatically makes container snapshots at key times during the build process
|
64
|
+
# default value is `true`
|
65
|
+
#enable_build_snapshots: true
|
66
|
+
|
67
|
+
# base_container must be the name of an existing container
|
64
68
|
base_container: b-ubuntu-1404
|
65
69
|
|
66
70
|
# list any host directories you want mounted into the servers
|
data/lib/dev-lxc/cluster.rb
CHANGED
@@ -21,6 +21,11 @@ module DevLXC
|
|
21
21
|
products = server_config['products']
|
22
22
|
products ||= Hash.new
|
23
23
|
|
24
|
+
enable_build_snapshots = cluster_config[server_type]["enable_build_snapshots"]
|
25
|
+
enable_build_snapshots = cluster_config["enable_build_snapshots"] if enable_build_snapshots.nil?
|
26
|
+
enable_build_snapshots = server_config["enable_build_snapshots"] if server_config.key?("enable_build_snapshots")
|
27
|
+
enable_build_snapshots = true if enable_build_snapshots.nil?
|
28
|
+
|
24
29
|
mounts = ["/var/dev-lxc var/dev-lxc"]
|
25
30
|
if cluster_config[server_type]["mounts"]
|
26
31
|
mounts.concat(cluster_config[server_type]["mounts"])
|
@@ -42,6 +47,8 @@ module DevLXC
|
|
42
47
|
products: products,
|
43
48
|
ipaddress: server_config['ipaddress'],
|
44
49
|
additional_fqdn: nil,
|
50
|
+
enable_build_snapshots: enable_build_snapshots,
|
51
|
+
first_run: false,
|
45
52
|
mounts: mounts,
|
46
53
|
ssh_keys: ssh_keys,
|
47
54
|
base_container_name: base_container_name
|
@@ -318,14 +325,18 @@ module DevLXC
|
|
318
325
|
configured_servers = Array.new
|
319
326
|
servers = get_sorted_servers(server_name_regex)
|
320
327
|
exit 1 if abort_up(servers)
|
321
|
-
prep_product_cache(servers)
|
322
328
|
servers.each do |server|
|
323
|
-
|
329
|
+
unless server.container.defined?
|
330
|
+
clone_from_base_container(server)
|
331
|
+
@server_configs[server.name][:first_run] = true
|
332
|
+
end
|
324
333
|
end
|
334
|
+
prep_product_cache(servers)
|
325
335
|
# get_sorted_servers is called again in order to ensure the container objects are initialized properly in case they were just cloned from the base container
|
326
336
|
servers = get_sorted_servers(server_name_regex)
|
327
337
|
create_dns_records unless servers.empty?
|
328
338
|
servers.each do |server|
|
339
|
+
next if ! @server_configs[server.name][:enable_build_snapshots] && ! @server_configs[server.name][:first_run]
|
329
340
|
if %w(build-nodes runners).include?(@server_configs[server.name][:server_type])
|
330
341
|
next if @server_configs[server.name][:required_products]["chefdk"] && @server_configs[server.name][:required_products].length == 1
|
331
342
|
end
|
@@ -336,6 +347,7 @@ module DevLXC
|
|
336
347
|
if server.name == @config["chef-backend"][:bootstrap_frontend]
|
337
348
|
running_backends = Array.new
|
338
349
|
@config["chef-backend"][:backends].reverse_each do |server_name|
|
350
|
+
next unless @server_configs[server_name][:enable_build_snapshots]
|
339
351
|
backend = get_server(server_name)
|
340
352
|
if backend.container.defined? && backend.snapshot_list.select { |sn| sn[2].to_s.start_with?("dev-lxc build: backend cluster configured but frontend not bootstrapped") }.empty?
|
341
353
|
if backend.container.running?
|
@@ -348,14 +360,17 @@ module DevLXC
|
|
348
360
|
end
|
349
361
|
end
|
350
362
|
@config["chef-backend"][:backends].each do |server_name|
|
363
|
+
next unless @server_configs[server_name][:enable_build_snapshots]
|
351
364
|
if running_backends.include?(server_name)
|
352
365
|
get_server(server_name).start
|
353
366
|
configured_servers << server_name unless configured_servers.include?(server_name)
|
354
367
|
end
|
355
368
|
end
|
356
369
|
end
|
357
|
-
|
358
|
-
|
370
|
+
if @server_configs[server.name][:enable_build_snapshots] || @server_configs[server.name][:first_run]
|
371
|
+
configure_products(server)
|
372
|
+
configured_servers << server.name
|
373
|
+
end
|
359
374
|
end
|
360
375
|
if server.container.running?
|
361
376
|
puts "Container '#{server.name}' is already running"
|
@@ -365,11 +380,13 @@ module DevLXC
|
|
365
380
|
end
|
366
381
|
end
|
367
382
|
configured_servers.reverse_each do |server_name|
|
383
|
+
next unless @server_configs[server_name][:enable_build_snapshots]
|
368
384
|
server = get_server(server_name)
|
369
385
|
server.shutdown if server.container.running?
|
370
386
|
server.snapshot("dev-lxc build: completed")
|
371
387
|
end
|
372
388
|
configured_servers.each do |server_name|
|
389
|
+
next unless @server_configs[server_name][:enable_build_snapshots]
|
373
390
|
server = get_server(server_name)
|
374
391
|
server.start if server.container.defined?
|
375
392
|
end
|
@@ -378,7 +395,17 @@ module DevLXC
|
|
378
395
|
def abort_up(servers)
|
379
396
|
abort_up = false
|
380
397
|
servers.each do |server|
|
381
|
-
next if server.container.defined?
|
398
|
+
next if server.container.defined? && !server.snapshot_list.select { |sn| sn[2].to_s.start_with?("dev-lxc build: completed") }.empty?
|
399
|
+
next if ! @server_configs[server.name][:enable_build_snapshots] && ! @server_configs[server.name][:first_run]
|
400
|
+
if @server_configs[server.name][:server_type] == 'compliance' && @config["chef-server"][:topology] == "standalone"
|
401
|
+
if @config['chef-server'][:bootstrap_backend].nil?
|
402
|
+
puts "ERROR: '#{server.name}' requires a Chef Server bootstrap backend to be configured first."
|
403
|
+
abort_up = true
|
404
|
+
elsif !get_server(@config['chef-server'][:bootstrap_backend]).container.running? && servers.select { |s| s.name == @config['chef-server'][:bootstrap_backend] }.empty?
|
405
|
+
puts "ERROR: '#{server.name}' requires '#{@config['chef-server'][:bootstrap_backend]}' to be running first."
|
406
|
+
abort_up = true
|
407
|
+
end
|
408
|
+
end
|
382
409
|
if (@config['chef-server'][:frontends] && @config['chef-server'][:frontends].include?(server.name)) || server.name == @config['analytics'][:bootstrap_backend]
|
383
410
|
if @config['chef-server'][:bootstrap_backend].nil?
|
384
411
|
puts "ERROR: '#{server.name}' requires a Chef Server bootstrap backend to be configured first."
|
@@ -545,6 +572,9 @@ module DevLXC
|
|
545
572
|
elsif !force && !server.snapshot_list.select { |sn| sn[2].to_s.start_with?("dev-lxc build: completed") }.empty?
|
546
573
|
# Skipping product cache preparation for container because it has a 'build: completed' snapshot
|
547
574
|
next
|
575
|
+
elsif ! @server_configs[server.name][:enable_build_snapshots] && ! @server_configs[server.name][:first_run]
|
576
|
+
# Skipping product cache preparation for container because it build snapshots are disabled and this is not the container's first run
|
577
|
+
next
|
548
578
|
end
|
549
579
|
products.each do |product_name, product_options|
|
550
580
|
if product_options && product_options['package_source']
|
@@ -574,7 +604,7 @@ module DevLXC
|
|
574
604
|
open(package_source) { |url| File.open(product_cache_path, 'wb') { |f| f.write(url.read) } }
|
575
605
|
end
|
576
606
|
if package_sha256 != Digest::SHA256.file(product_cache_path).hexdigest
|
577
|
-
puts "ERROR: Incorrect SHA256 for #{product_cache_path}
|
607
|
+
puts "ERROR: Incorrect SHA256 for #{product_cache_path}"
|
578
608
|
exit 1
|
579
609
|
end
|
580
610
|
elsif !File.exist?(package_source)
|
@@ -602,9 +632,11 @@ module DevLXC
|
|
602
632
|
next if %w(build-nodes runners).include?(@server_configs[server.name][:server_type]) && product_name == "chefdk"
|
603
633
|
server.install_package(package_source)
|
604
634
|
end
|
605
|
-
server.
|
606
|
-
|
607
|
-
|
635
|
+
if @server_configs[server.name][:enable_build_snapshots]
|
636
|
+
server.shutdown
|
637
|
+
server.snapshot("dev-lxc build: products installed")
|
638
|
+
server.start if server_was_running
|
639
|
+
end
|
608
640
|
end
|
609
641
|
|
610
642
|
def configure_products(server)
|
@@ -894,6 +926,31 @@ ssl_verify_mode :verify_none
|
|
894
926
|
server.run_command("chef-compliance-ctl user-create #{admin_user} #{admin_user}")
|
895
927
|
server.run_command("chef-compliance-ctl restart core")
|
896
928
|
end
|
929
|
+
|
930
|
+
if @config["chef-server"][:topology] == "standalone"
|
931
|
+
chef_server = get_server(@config['chef-server'][:bootstrap_backend])
|
932
|
+
FileUtils.mkdir_p("#{chef_server.container.config_item('lxc.rootfs')}/root/integrate-compliance-with-chef-server")
|
933
|
+
FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/root/integrate-compliance-with-chef-server")
|
934
|
+
IO.write("#{server.container.config_item('lxc.rootfs')}/root/integrate-compliance-with-chef-server/prepare-chef-compliance",
|
935
|
+
"chef-compliance-ctl connect chef-server --non-interactive true --chef-app-id 'compliance_server' --auth-id 'Chef Server' --insecure true --compliance-url 'https://#{server.name}'"
|
936
|
+
)
|
937
|
+
server.run_command("bash /root/integrate-compliance-with-chef-server/prepare-chef-compliance", "#{server.container.config_item('lxc.rootfs')}/root/integrate-compliance-with-chef-server/prepare-chef-compliance-output")
|
938
|
+
server.run_command("chef-compliance-ctl reconfigure")
|
939
|
+
server.run_command("chef-compliance-ctl restart core")
|
940
|
+
prepare_chef_compliance_output = IO.read("#{server.container.config_item('lxc.rootfs')}/root/integrate-compliance-with-chef-server/prepare-chef-compliance-output")
|
941
|
+
delimited_chef_server_command = prepare_chef_compliance_output.match(/\n---\n(.+)\n---/m)
|
942
|
+
if delimited_chef_server_command
|
943
|
+
IO.write("#{chef_server.container.config_item('lxc.rootfs')}/root/integrate-compliance-with-chef-server/configure-chef-server", delimited_chef_server_command[1])
|
944
|
+
chef_server.run_command("bash /root/integrate-compliance-with-chef-server/configure-chef-server", "#{chef_server.container.config_item('lxc.rootfs')}/root/integrate-compliance-with-chef-server/configure-chef-server-output")
|
945
|
+
end
|
946
|
+
configure_chef_server_output = IO.read("#{chef_server.container.config_item('lxc.rootfs')}/root/integrate-compliance-with-chef-server/configure-chef-server-output")
|
947
|
+
compliance_command = configure_chef_server_output.match(/^chef-compliance-ctl .+$/)
|
948
|
+
if compliance_command
|
949
|
+
IO.write("#{server.container.config_item('lxc.rootfs')}/root/integrate-compliance-with-chef-server/configure-chef-compliance", compliance_command)
|
950
|
+
server.run_command("bash /root/integrate-compliance-with-chef-server/configure-chef-compliance")
|
951
|
+
server.run_command("chef-compliance-ctl reconfigure")
|
952
|
+
end
|
953
|
+
end
|
897
954
|
end
|
898
955
|
|
899
956
|
def configure_supermarket(server)
|
data/lib/dev-lxc/server.rb
CHANGED
@@ -47,10 +47,8 @@ module DevLXC
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def shutdown
|
50
|
-
|
51
|
-
@container.
|
52
|
-
remove_static_ip_address(hwaddr)
|
53
|
-
release_lingering_dhcp_ip_addresses(hwaddr)
|
50
|
+
@container.shutdown if @container.running?
|
51
|
+
remove_static_ip_address(@container.config_item("lxc.network.0.hwaddr")) if @container.defined?
|
54
52
|
end
|
55
53
|
|
56
54
|
def snapshot(comment=nil)
|
@@ -144,18 +142,16 @@ module DevLXC
|
|
144
142
|
end
|
145
143
|
|
146
144
|
def destroy
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
end
|
145
|
+
return unless @container.defined?
|
146
|
+
@container.snapshot_list.each { |snapshot| @container.snapshot_destroy(snapshot.first) }
|
147
|
+
hwaddr = @container.config_item("lxc.network.0.hwaddr")
|
151
148
|
@container.destroy
|
152
149
|
remove_static_ip_address(hwaddr)
|
153
|
-
release_lingering_dhcp_ip_addresses(hwaddr)
|
154
150
|
end
|
155
151
|
|
156
152
|
def release_lingering_dhcp_ip_addresses(hwaddr)
|
157
153
|
dhcp_leases = IO.readlines('/var/lib/misc/dnsmasq.lxcbr0.leases')
|
158
|
-
dhcp_leases.
|
154
|
+
leases_to_release = dhcp_leases.map do |dhcp_lease|
|
159
155
|
if m = dhcp_lease.match(/ #{hwaddr} (\d+\.\d+\.\d+\.\d+) /)
|
160
156
|
mac_addr = hwaddr
|
161
157
|
ip_addr = m[1]
|
@@ -167,10 +163,18 @@ module DevLXC
|
|
167
163
|
ip_addr = m[2]
|
168
164
|
end
|
169
165
|
if mac_addr && ip_addr
|
170
|
-
|
171
|
-
system("dhcp_release lxcbr0 #{ip_addr} #{mac_addr}")
|
166
|
+
{ dhcp_lease: dhcp_lease, mac_addr: mac_addr, ip_addr: ip_addr }
|
172
167
|
end
|
173
168
|
end
|
169
|
+
leases_to_release.compact!
|
170
|
+
unless leases_to_release.empty?
|
171
|
+
system("systemctl stop lxc-net.service")
|
172
|
+
leases_to_release.each do |l|
|
173
|
+
puts "Releasing lingering DHCP lease: #{l[:dhcp_lease]}"
|
174
|
+
DevLXC.search_file_delete_line("/var/lib/misc/dnsmasq.lxcbr0.leases", /( #{l[:mac_addr]} #{l[:ip_addr]} )/)
|
175
|
+
end
|
176
|
+
system("systemctl start lxc-net.service")
|
177
|
+
end
|
174
178
|
end
|
175
179
|
|
176
180
|
def assign_static_ip_address(hwaddr)
|
@@ -180,14 +184,11 @@ module DevLXC
|
|
180
184
|
DevLXC.reload_dnsmasq
|
181
185
|
end
|
182
186
|
|
183
|
-
def remove_static_ip_address(hwaddr)
|
184
|
-
if
|
185
|
-
DevLXC.search_file_delete_line("/etc/lxc/dhcp-hosts.conf", /,#{@ipaddress}$/)
|
186
|
-
end
|
187
|
-
unless hwaddr.nil?
|
187
|
+
def remove_static_ip_address(hwaddr=nil)
|
188
|
+
if hwaddr
|
188
189
|
DevLXC.search_file_delete_line("/etc/lxc/dhcp-hosts.conf", /^#{hwaddr}/)
|
190
|
+
DevLXC.reload_dnsmasq
|
189
191
|
end
|
190
|
-
DevLXC.reload_dnsmasq
|
191
192
|
end
|
192
193
|
|
193
194
|
end
|
data/lib/dev-lxc/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dev-lxc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremiah Snapp
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|