dev-lxc 0.2.5 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7d4ae58ed1605db4dffdfb5c8d56b150b1371141
4
- data.tar.gz: e57063974d71caaa0690b38076aa4524ed9c9804
3
+ metadata.gz: ad3bac1e078481c496d8bba29bf48a5ec94ae4e2
4
+ data.tar.gz: 08f93c461e0025e70c7e52cddfc021288008169a
5
5
  SHA512:
6
- metadata.gz: 7b6bb19d1245a3004402e82a8adf6462f76fc52058790b1a2e7c556fcf6df887b96a1f9a49402057b8a0402631b3965c7e6a5a0a934b01cdb716df9f67b07486
7
- data.tar.gz: 8ad996d4fd7adda6663f44cda48f04d62a96cf125828159426887be5cd5f1e298e3d23b7a2444564d7fb20d77d3adf449e21c90e4fe816fbe939f9833e6ddedc
6
+ metadata.gz: fe9e4793eaa9b92a18471fd58863153204661ca18f9204042971b1e9aa44222d1ea13abc7d8fbacd8015291735e7aef17d986e7280c30b587c4f5570857f6de7
7
+ data.tar.gz: d7baa7c93dff7630920778298c4607d0d539f1730e68897b75babb2c71f3e50e406243c9b127d78143717d86a5a844b26b1c0602bfa357b3947da6afb35fcf41
data/README.md CHANGED
@@ -13,7 +13,7 @@ cluster builds for demo purposes, as well as general experimentation and explora
13
13
  1. LXC 1.0 Containers - Resource efficient servers with fast start/stop times and standard init
14
14
  2. Btrfs - Efficient storage backend provides fast, lightweight container cloning
15
15
  3. Dnsmasq - DHCP networking and DNS resolution
16
- 4. Base platforms - Containers that are built to resemble a traditional server
16
+ 4. Base containers - Containers that are built to resemble a traditional server
17
17
  5. ruby-lxc - Ruby bindings for liblxc
18
18
  6. YAML - Simple, customizable definition of clusters; No more setting ENV variables
19
19
  7. Build process closely models online installation documentation
@@ -77,32 +77,34 @@ Run `gem update dev-lxc` inside the Vagrant VM to ensure you have the latest ver
77
77
 
78
78
  One of the key things this tool uses is the concept of "base" containers.
79
79
 
80
- `dev-lxc` creates containers with "b-" prepended to the name to distinguish it as
81
- a base container.
80
+ `dev-lxc` creates base containers with a "p-", "s-" or "u-" prefix on the name to distinguish it as
81
+ a "platform", "shared" or "unique" base container.
82
82
 
83
83
  Base containers are then snapshot cloned using the btrfs filesystem to very quickly
84
- provide lightweight duplicates of the base container that are either used to build
84
+ provide a lightweight duplicate of the base container. This clone is either used to build
85
85
  another base container or a container that will actually be run.
86
86
 
87
87
  During a cluster build process the base containers that get created fall into three categories.
88
88
 
89
89
  1. Platform
90
90
 
91
- The platform base container is the first to get created.
91
+ The platform base container is the first to get created and is identified by the
92
+ "p-" prefix on the container name.
92
93
 
93
94
  `DevLXC#create_base_platform` controls the creation of a platform base container.
94
95
 
95
- This container provides the chosen OS platform and version (e.g. b-ubuntu-1404).
96
+ This container provides the chosen OS platform and version (e.g. p-ubuntu-1404).
96
97
  A typical LXC container has minimal packages installed so `dev-lxc` makes sure that the
97
98
  same packages used in Chef's [bento boxes](https://github.com/opscode/bento) are
98
99
  installed to provide a more typical server environment.
99
100
  A few additional packages are also installed.
100
101
 
101
- Once this platform base container is created there is rarely a need to delete it.
102
+ *Once this platform base container is created there is rarely a need to delete it.*
102
103
 
103
104
  2. Shared
104
105
 
105
- The shared base container is the second to get created.
106
+ The shared base container is the second to get created and is identified by the
107
+ "s-" prefix on the container name.
106
108
 
107
109
  `DevLXC::ChefServer#create_base_server` controls the creation of a shared base container.
108
110
 
@@ -113,14 +115,15 @@ During a cluster build process the base containers that get created fall into th
113
115
  servers (i.e. it does not get installed on backend servers).
114
116
 
115
117
  The name of this base container is built from the names and versions of the Chef packages that
116
- get installed which makes this base container easy to be reused by another cluster that is
118
+ get installed which makes this base container easy to be reused by another cluster that is
117
119
  configured to use the same Chef packages.
118
120
 
119
- Since no configuration actually happens yet there is rarely a need to delete this container.
121
+ *Since no configuration actually happens yet there is rarely a need to delete this container.*
120
122
 
121
123
  3. Unique
122
124
 
123
- The unique base container is the last to get created.
125
+ The unique base container is the last to get created and is identified by the
126
+ "u-" prefix on the container name.
124
127
 
125
128
  `DevLXC::ChefServer#create` controls the creation of a unique base container.
126
129
 
@@ -165,7 +168,7 @@ You can see a menu of platform base containers this tool can create by using the
165
168
  The initial creation of platform base containers can take awhile so let's go ahead and start creating
166
169
  an Ubuntu 12.04 base container now.
167
170
 
168
- dev-lxc create b-ubuntu-1404
171
+ dev-lxc create p-ubuntu-1404
169
172
 
170
173
  ### Cluster Config Files
171
174
 
@@ -177,16 +180,16 @@ The following command generates sample config files for various cluster topologi
177
180
 
178
181
  `dev-lxc cluster init tier` generates the following file:
179
182
 
180
- base_platform: b-ubuntu-1404
183
+ platform_container: p-ubuntu-1404
181
184
  topology: tier
182
185
  api_fqdn: chef-tier.lxc
183
186
  mounts:
184
187
  - /dev-shared dev-shared
185
188
  packages:
186
- server: /dev-shared/chef-packages/cs/chef-server-core_12.0.1-1_amd64.deb
187
- # reporting: /dev-shared/chef-packages/cs/reporting/opscode-reporting_1.2.3-1_amd64.deb
188
- # push-jobs-server: /dev-shared/chef-packages/cs/push-jobs-server/opscode-push-jobs-server_1.1.6-1_amd64.deb
189
- # manage: /dev-shared/chef-packages/cs/manage/opscode-manage_1.6.2-1_amd64.deb
189
+ server: /dev-shared/chef-packages/cs/chef-server-core_12.0.3-1_amd64.deb
190
+ # reporting: /dev-shared/chef-packages/reporting/opscode-reporting_1.2.3-1_amd64.deb
191
+ # push-jobs-server: /dev-shared/chef-packages/push-jobs-server/opscode-push-jobs-server_1.1.6-1_amd64.deb
192
+ # manage: /dev-shared/chef-packages/manage/opscode-manage_1.9.0-1_amd64.deb
190
193
  servers:
191
194
  be-tier.lxc:
192
195
  role: backend
@@ -307,6 +310,14 @@ Show the status of the cluster.
307
310
 
308
311
  dev-cluster status
309
312
 
313
+ Create a local chef-repo with appropriate knife.rb and pem files.
314
+ This makes it easy to use knife.
315
+
316
+ dev-lxc cluster chef-repo
317
+ cd chef-repo
318
+ knife ssl fetch
319
+ knife client list
320
+
310
321
  Stop the cluster's servers.
311
322
 
312
323
  dev-lxc cluster stop
data/dev-lxc.gemspec CHANGED
@@ -21,5 +21,5 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake", "~> 0"
23
23
  spec.add_runtime_dependency "thor", "~> 0"
24
- spec.add_runtime_dependency "ruby-lxc", "~> 1.0.1"
24
+ spec.add_runtime_dependency "ruby-lxc", "~> 1.0.2"
25
25
  end
@@ -1,4 +1,4 @@
1
- base_platform: b-ubuntu-1204
1
+ platform_container: p-ubuntu-1204
2
2
  topology: open-source
3
3
  api_fqdn: chef-osc.lxc
4
4
  mounts:
@@ -1,13 +1,13 @@
1
- base_platform: b-ubuntu-1404
1
+ platform_container: p-ubuntu-1404
2
2
  topology: standalone
3
3
  api_fqdn: chef-standalone.lxc
4
4
  mounts:
5
5
  - /dev-shared dev-shared
6
6
  packages:
7
- server: /dev-shared/chef-packages/cs/chef-server-core_12.0.1-1_amd64.deb
8
- # reporting: /dev-shared/chef-packages/cs/reporting/opscode-reporting_1.2.3-1_amd64.deb
9
- # push-jobs-server: /dev-shared/chef-packages/cs/push-jobs-server/opscode-push-jobs-server_1.1.6-1_amd64.deb
10
- # manage: /dev-shared/chef-packages/cs/manage/opscode-manage_1.6.2-1_amd64.deb
7
+ server: /dev-shared/chef-packages/cs/chef-server-core_12.0.3-1_amd64.deb
8
+ # reporting: /dev-shared/chef-packages/reporting/opscode-reporting_1.2.3-1_amd64.deb
9
+ # push-jobs-server: /dev-shared/chef-packages/push-jobs-server/opscode-push-jobs-server_1.1.6-1_amd64.deb
10
+ # manage: /dev-shared/chef-packages/manage/opscode-manage_1.9.0-1_amd64.deb
11
11
  servers:
12
12
  chef-standalone.lxc:
13
13
  ipaddress: 10.0.3.201
@@ -1,13 +1,13 @@
1
- base_platform: b-ubuntu-1404
1
+ platform_container: p-ubuntu-1404
2
2
  topology: tier
3
3
  api_fqdn: chef-tier.lxc
4
4
  mounts:
5
5
  - /dev-shared dev-shared
6
6
  packages:
7
- server: /dev-shared/chef-packages/cs/chef-server-core_12.0.1-1_amd64.deb
8
- # reporting: /dev-shared/chef-packages/cs/reporting/opscode-reporting_1.2.3-1_amd64.deb
9
- # push-jobs-server: /dev-shared/chef-packages/cs/push-jobs-server/opscode-push-jobs-server_1.1.6-1_amd64.deb
10
- # manage: /dev-shared/chef-packages/cs/manage/opscode-manage_1.6.2-1_amd64.deb
7
+ server: /dev-shared/chef-packages/cs/chef-server-core_12.0.3-1_amd64.deb
8
+ # reporting: /dev-shared/chef-packages/reporting/opscode-reporting_1.2.3-1_amd64.deb
9
+ # push-jobs-server: /dev-shared/chef-packages/push-jobs-server/opscode-push-jobs-server_1.1.6-1_amd64.deb
10
+ # manage: /dev-shared/chef-packages/manage/opscode-manage_1.9.0-1_amd64.deb
11
11
  servers:
12
12
  be-tier.lxc:
13
13
  role: backend
@@ -2,20 +2,17 @@ require "dev-lxc/chef-server"
2
2
 
3
3
  module DevLXC
4
4
  class ChefCluster
5
- attr_reader :api_fqdn, :topology, :bootstrap_backend, :secondary_backend, :frontends
5
+ attr_reader :api_fqdn, :topology, :bootstrap_backend, :frontends
6
6
 
7
7
  def initialize(cluster_config)
8
8
  @cluster_config = cluster_config
9
9
  @api_fqdn = @cluster_config["api_fqdn"]
10
10
  @topology = @cluster_config["topology"]
11
11
  @servers = @cluster_config["servers"]
12
- if %w(tier ha).include?(@topology)
12
+ if @topology == 'tier'
13
13
  @bootstrap_backend = @servers.select {|k,v| v["role"] == "backend" && v["bootstrap"] == true}.first.first
14
14
  @frontends = @servers.select {|k,v| v["role"] == "frontend"}.keys
15
15
  end
16
- if @topology == "ha"
17
- @secondary_backend = @servers.select {|k,v| v["role"] == "backend" && v["bootstrap"] == nil}.first.first
18
- end
19
16
  end
20
17
 
21
18
  def chef_servers
@@ -28,12 +25,6 @@ module DevLXC
28
25
  @frontends.each do |frontend_name|
29
26
  chef_servers << ChefServer.new(frontend_name, @cluster_config)
30
27
  end
31
- when "ha"
32
- chef_servers << ChefServer.new(@bootstrap_backend, @cluster_config)
33
- chef_servers << ChefServer.new(@secondary_backend, @cluster_config)
34
- @frontends.each do |frontend_name|
35
- chef_servers << ChefServer.new(frontend_name, @cluster_config)
36
- end
37
28
  end
38
29
  chef_servers
39
30
  end
@@ -49,6 +40,44 @@ module DevLXC
49
40
  abspath.compact
50
41
  end
51
42
 
43
+ def chef_repo
44
+ case @topology
45
+ when "open-source"
46
+ puts "Unable to create a chef-repo for an Open Source Chef Server"
47
+ exit 1
48
+ when "standalone"
49
+ chef_server = ChefServer.new(@servers.keys.first, @cluster_config)
50
+ when "tier"
51
+ chef_server = ChefServer.new(@bootstrap_backend, @cluster_config)
52
+ end
53
+ if ! chef_server.server.defined?
54
+ puts "The '#{chef_server.server.name}' Chef Server does not exist. Please create it first."
55
+ exit 1
56
+ end
57
+ puts "Creating chef-repo with pem files and knife.rb in the current directory"
58
+ FileUtils.mkdir_p("./chef-repo/.chef")
59
+ knife_rb = %Q(
60
+ current_dir = File.dirname(__FILE__)
61
+
62
+ chef_server_url "https://#{api_fqdn}/organizations/ponyville"
63
+
64
+ node_name "rainbowdash"
65
+ client_key "\#{current_dir}/rainbowdash.pem"
66
+
67
+ validation_client_name "ponyville-validator"
68
+ validation_key "\#{current_dir}/ponyville-validator.pem"
69
+
70
+ cookbook_path Dir.pwd + "/cookbooks"
71
+ knife[:chef_repo_path] = Dir.pwd
72
+ )
73
+ IO.write("./chef-repo/.chef/knife.rb", knife_rb)
74
+ if Dir.glob("#{chef_server.abspath('/root/chef-repo/.chef')}/*.pem").empty?
75
+ puts "The pem files can not be copied because they do not exist in '#{chef_server.server.name}' Chef Server's `/root/chef-repo/.chef` directory"
76
+ else
77
+ FileUtils.cp( Dir.glob("#{chef_server.abspath('/root/chef-repo/.chef')}/*.pem"), "./chef-repo/.chef" )
78
+ end
79
+ end
80
+
52
81
  def run_command(command)
53
82
  chef_servers.each { |cs| cs.run_command(command) }
54
83
  end
@@ -67,54 +96,34 @@ module DevLXC
67
96
  puts "Destroying cluster"
68
97
  chef_servers.reverse_each { |cs| cs.destroy }
69
98
  end
70
-
71
- def destroy_base_container(type)
99
+
100
+ def destroy_container(type)
72
101
  case type
73
102
  when :unique
74
103
  @servers.keys.each do |server_name|
75
- DevLXC::ChefServer.new(server_name, @cluster_config).destroy_base_container(:unique)
104
+ DevLXC::ChefServer.new(server_name, @cluster_config).destroy_container(:unique)
76
105
  end
77
106
  when :shared
78
- DevLXC::ChefServer.new(@servers.keys.first, @cluster_config).destroy_base_container(:shared)
107
+ DevLXC::ChefServer.new(@servers.keys.first, @cluster_config).destroy_container(:shared)
79
108
  when :platform
80
- DevLXC::ChefServer.new(@servers.keys.first, @cluster_config).destroy_base_container(:platform)
109
+ DevLXC::ChefServer.new(@servers.keys.first, @cluster_config).destroy_container(:platform)
81
110
  end
82
111
  end
83
112
 
84
113
  def chef_server_config
85
114
  chef_server_config = %Q(api_fqdn "#{@api_fqdn}"\n)
86
- if %w(tier ha).include?(@topology)
115
+ if @topology == 'tier'
87
116
  chef_server_config += %Q(
88
117
  topology "#{@topology}"
89
118
 
90
119
  server "#{@bootstrap_backend}",
91
120
  :ipaddress => "#{@servers[@bootstrap_backend]["ipaddress"]}",
92
121
  :role => "backend",
93
- :bootstrap => true)
94
-
95
- case @topology
96
- when "tier"
97
- chef_server_config += %Q(
122
+ :bootstrap => true
98
123
 
99
124
  backend_vip "#{@bootstrap_backend}",
100
125
  :ipaddress => "#{@servers[@bootstrap_backend]["ipaddress"]}"
101
126
  )
102
- when "ha"
103
- backend_vip_name = config["backend_vip"].keys.first
104
- chef_server_config += %Q(,
105
- :cluster_ipaddress => "#{@servers[@bootstrap_backend]["cluster_ipaddress"]}"
106
-
107
- server "#{@secondary_backend}",
108
- :ipaddress => "#{@servers[@secondary_backend]["ipaddress"]}",
109
- :role => "backend",
110
- :cluster_ipaddress => "#{@servers[@secondary_backend]["cluster_ipaddress"]}
111
-
112
- backend_vip "#{backend_vip_name}",
113
- :ipaddress => "#{config["backend_vip"][backend_vip_name]["ipaddress"]}",
114
- :device => "#{config["backend_vip"][backend_vip_name]["device"]}",
115
- :heartbeat_device => "#{config["backend_vip"][backend_vip_name]["heartbeat_device"]}"
116
- )
117
- end
118
127
  @frontends.each do |frontend_name|
119
128
  chef_server_config += %Q(
120
129
  server "#{frontend_name}",
@@ -3,7 +3,7 @@ require "dev-lxc/chef-cluster"
3
3
 
4
4
  module DevLXC
5
5
  class ChefServer
6
- attr_reader :base_platform, :base_server_name
6
+ attr_reader :platform_container_name, :server, :shared_container_name
7
7
 
8
8
  def initialize(name, cluster_config)
9
9
  unless cluster_config["servers"].keys.include?(name)
@@ -16,16 +16,15 @@ module DevLXC
16
16
  case cluster.topology
17
17
  when "open-source", "standalone"
18
18
  @role = cluster.topology
19
- when "tier", "ha"
19
+ when "tier"
20
20
  @role = "bootstrap_backend" if @server.name == cluster.bootstrap_backend
21
- @role = "secondary_backend" if @server.name == cluster.secondary_backend
22
21
  @role = "frontend" if cluster.frontends.include?(@server.name)
23
22
  end
24
23
  @mounts = cluster_config["mounts"]
25
24
  @bootstrap_backend = cluster.bootstrap_backend
26
25
  @chef_server_config = cluster.chef_server_config
27
26
  @api_fqdn = cluster.api_fqdn
28
- @base_platform = cluster_config["base_platform"]
27
+ @platform_container_name = cluster_config["platform_container"]
29
28
  @packages = cluster_config["packages"]
30
29
 
31
30
  if File.basename(@packages["server"]).match(/^(\w+-\w+.*)[_-]((?:\d+\.?){3,})-/)
@@ -33,21 +32,21 @@ module DevLXC
33
32
  @chef_server_version = Regexp.last_match[2].gsub(".", "-")
34
33
  end
35
34
 
36
- @base_server_name = @base_platform
35
+ @shared_container_name = "s#{@platform_container_name[1..-1]}"
37
36
  case @chef_server_type
38
37
  when 'chef-server-core'
39
- @base_server_name += '-cs'
38
+ @shared_container_name += '-cs'
40
39
  @server_ctl = 'chef-server'
41
40
  when 'private-chef'
42
- @base_server_name += '-ec'
41
+ @shared_container_name += '-ec'
43
42
  @server_ctl = 'private-chef'
44
43
  when 'chef-server'
45
- @base_server_name += '-osc'
44
+ @shared_container_name += '-osc'
46
45
  @server_ctl = 'chef-server'
47
46
  end
48
- @base_server_name += "-#{@chef_server_version}"
49
- @base_server_name += "-reporting-#{Regexp.last_match[1].gsub(".", "-")}" if @packages["reporting"].to_s.match(/[_-]((\d+\.?){3,})-/)
50
- @base_server_name += "-pushy-#{Regexp.last_match[1].gsub(".", "-")}" if @packages["push-jobs-server"].to_s.match(/[_-]((\d+\.?){3,})-/)
47
+ @shared_container_name += "-#{@chef_server_version}"
48
+ @shared_container_name += "-reporting-#{Regexp.last_match[1].gsub(".", "-")}" if @packages["reporting"].to_s.match(/[_-]((\d+\.?){3,})-/)
49
+ @shared_container_name += "-pushy-#{Regexp.last_match[1].gsub(".", "-")}" if @packages["push-jobs-server"].to_s.match(/[_-]((\d+\.?){3,})-/)
51
50
  end
52
51
 
53
52
  def status
@@ -103,14 +102,14 @@ module DevLXC
103
102
  DevLXC.reload_dnsmasq
104
103
  end
105
104
 
106
- def destroy_base_container(type)
105
+ def destroy_container(type)
107
106
  case type
108
107
  when :unique
109
- DevLXC::Container.new("b-#{@server.name}").destroy
108
+ DevLXC::Container.new("u-#{@server.name}").destroy
110
109
  when :shared
111
- DevLXC::Container.new(@base_server_name).destroy
110
+ DevLXC::Container.new(@shared_container_name).destroy
112
111
  when :platform
113
- DevLXC::Container.new(@base_platform).destroy
112
+ DevLXC::Container.new(@platform_container_name).destroy
114
113
  end
115
114
  end
116
115
 
@@ -119,10 +118,10 @@ module DevLXC
119
118
  puts "Using existing container #{@server.name}"
120
119
  return
121
120
  end
122
- server_clone = DevLXC::Container.new("b-#{@server.name}")
123
- if server_clone.defined?
124
- puts "Cloning container #{server_clone.name} into container #{@server.name}"
125
- server_clone.clone(@server.name, {:flags => LXC::LXC_CLONE_SNAPSHOT|LXC::LXC_CLONE_KEEPMACADDR})
121
+ unique_container = DevLXC::Container.new("u-#{@server.name}")
122
+ if unique_container.defined?
123
+ puts "Cloning shared container #{unique_container.name} into container #{@server.name}"
124
+ unique_container.clone(@server.name, {:flags => LXC::LXC_CLONE_SNAPSHOT|LXC::LXC_CLONE_KEEPMACADDR})
126
125
  @server = DevLXC::Container.new(@server.name)
127
126
  return
128
127
  else
@@ -130,9 +129,9 @@ module DevLXC
130
129
  unless %w(open-source standalone).include?(@role) || @server.name == @bootstrap_backend || DevLXC::Container.new(@bootstrap_backend).defined?
131
130
  raise "The bootstrap backend server must be created first."
132
131
  end
133
- base_server = create_base_server
134
- puts "Cloning container #{base_server.name} into container #{@server.name}"
135
- base_server.clone(@server.name, {:flags => LXC::LXC_CLONE_SNAPSHOT})
132
+ shared_container = create_shared_container
133
+ puts "Cloning shared container #{shared_container.name} into container #{@server.name}"
134
+ shared_container.clone(@server.name, {:flags => LXC::LXC_CLONE_SNAPSHOT})
136
135
  @server = DevLXC::Container.new(@server.name)
137
136
  puts "Adding lxc.hook.post-stop hook"
138
137
  @server.set_config_item("lxc.hook.post-stop", "/usr/local/share/lxc/hooks/post-stop-dhcp-release")
@@ -145,7 +144,7 @@ module DevLXC
145
144
  @server.start
146
145
  configure_server unless @packages["server"].nil?
147
146
  create_users if %w(standalone bootstrap_backend).include?(@role)
148
- if %w(standalone bootstrap_backend secondary_backend frontend).include?(@role)
147
+ if %w(standalone bootstrap_backend frontend).include?(@role)
149
148
  configure_reporting unless @packages["reporting"].nil?
150
149
  configure_push_jobs_server unless @packages["push-jobs-server"].nil?
151
150
  end
@@ -154,42 +153,41 @@ module DevLXC
154
153
  configure_manage
155
154
  end
156
155
  @server.stop
157
- puts "Cloning container #{@server.name} into b-#{@server.name}"
158
- @server.clone("b-#{@server.name}", {:flags => LXC::LXC_CLONE_SNAPSHOT|LXC::LXC_CLONE_KEEPMACADDR})
156
+ puts "Cloning container #{@server.name} into unique container #{unique_container.name}"
157
+ @server.clone("#{unique_container.name}", {:flags => LXC::LXC_CLONE_SNAPSHOT|LXC::LXC_CLONE_KEEPMACADDR})
159
158
  end
160
159
  end
161
160
 
162
- def create_base_server
163
- base_server = DevLXC::Container.new(@base_server_name)
164
- if base_server.defined?
165
- puts "Using existing container #{base_server.name}"
166
- return base_server
161
+ def create_shared_container
162
+ shared_container = DevLXC::Container.new(@shared_container_name)
163
+ if shared_container.defined?
164
+ puts "Using existing shared container #{shared_container.name}"
165
+ return shared_container
167
166
  end
168
- base_platform = DevLXC.create_base_platform(@base_platform)
169
- puts "Cloning container #{base_platform.name} into container #{base_server.name}"
170
- base_platform.clone(base_server.name, {:flags => LXC::LXC_CLONE_SNAPSHOT})
171
- base_server = DevLXC::Container.new(base_server.name)
167
+ platform_container = DevLXC.create_platform_container(@platform_container_name)
168
+ puts "Cloning platform container #{platform_container.name} into shared container #{shared_container.name}"
169
+ platform_container.clone(shared_container.name, {:flags => LXC::LXC_CLONE_SNAPSHOT})
170
+ shared_container = DevLXC::Container.new(shared_container.name)
172
171
 
173
172
  # Disable certain sysctl.d files in Ubuntu 10.04, they cause `start procps` to fail
174
173
  # Enterprise Chef server's postgresql recipe expects to be able to `start procps`
175
- if base_platform.name == "b-ubuntu-1004"
176
- if File.exist?("#{base_server.config_item('lxc.rootfs')}/etc/sysctl.d/10-console-messages.conf")
177
- FileUtils.mv("#{base_server.config_item('lxc.rootfs')}/etc/sysctl.d/10-console-messages.conf",
178
- "#{base_server.config_item('lxc.rootfs')}/etc/sysctl.d/10-console-messages.conf.orig")
174
+ if platform_container.name == "p-ubuntu-1004"
175
+ if File.exist?("#{shared_container.config_item('lxc.rootfs')}/etc/sysctl.d/10-console-messages.conf")
176
+ FileUtils.mv("#{shared_container.config_item('lxc.rootfs')}/etc/sysctl.d/10-console-messages.conf",
177
+ "#{shared_container.config_item('lxc.rootfs')}/etc/sysctl.d/10-console-messages.conf.orig")
179
178
  end
180
179
  end
181
- # TODO when LXC 1.0.2 is released the following test can be done using #config_item("lxc.mount.auto")
182
- unless IO.readlines(base_server.config_file_name).select { |line| line.start_with?("lxc.mount.auto") }.empty?
183
- base_server.set_config_item("lxc.mount.auto", "proc:rw sys:rw")
184
- base_server.save_config
180
+ unless shared_container.config_item("lxc.mount.auto").empty?
181
+ shared_container.set_config_item("lxc.mount.auto", "proc:rw sys:rw")
182
+ shared_container.save_config
185
183
  end
186
- base_server.sync_mounts(@mounts)
187
- base_server.start
188
- base_server.install_package(@packages["server"]) unless @packages["server"].nil?
189
- base_server.install_package(@packages["reporting"]) unless @packages["reporting"].nil?
190
- base_server.install_package(@packages["push-jobs-server"]) unless @packages["push-jobs-server"].nil?
191
- base_server.stop
192
- return base_server
184
+ shared_container.sync_mounts(@mounts)
185
+ shared_container.start
186
+ shared_container.install_package(@packages["server"]) unless @packages["server"].nil?
187
+ shared_container.install_package(@packages["reporting"]) unless @packages["reporting"].nil?
188
+ shared_container.install_package(@packages["push-jobs-server"]) unless @packages["push-jobs-server"].nil?
189
+ shared_container.stop
190
+ return shared_container
193
191
  end
194
192
 
195
193
  def configure_server
@@ -211,7 +209,7 @@ module DevLXC
211
209
  IO.write("#{@server.config_item('lxc.rootfs')}/etc/opscode/chef-server.rb", @chef_server_config)
212
210
  end
213
211
  run_ctl(@server_ctl, "reconfigure")
214
- when "secondary_backend", "frontend"
212
+ when "frontend"
215
213
  puts "Copying /etc/opscode from bootstrap backend"
216
214
  FileUtils.cp_r("#{LXC::Container.new(@bootstrap_backend).config_item('lxc.rootfs')}/etc/opscode",
217
215
  "#{@server.config_item('lxc.rootfs')}/etc")
@@ -220,7 +218,7 @@ module DevLXC
220
218
  end
221
219
 
222
220
  def configure_reporting
223
- if %w(secondary_backend frontend).include?(@role)
221
+ if @role == 'frontend'
224
222
  puts "Copying /etc/opscode-reporting from bootstrap backend"
225
223
  FileUtils.cp_r("#{LXC::Container.new(@bootstrap_backend).config_item('lxc.rootfs')}/etc/opscode-reporting",
226
224
  "#{@server.config_item('lxc.rootfs')}/etc")
@@ -231,10 +229,7 @@ module DevLXC
231
229
 
232
230
  def configure_push_jobs_server
233
231
  run_ctl("opscode-push-jobs-server", "reconfigure")
234
- if %w(bootstrap_backend secondary_backend).include?(@role)
235
- run_ctl(@server_ctl, "reconfigure")
236
- end
237
- run_ctl(@server_ctl, "restart opscode-pushy-server")
232
+ run_ctl(@server_ctl, "reconfigure")
238
233
  end
239
234
 
240
235
  def configure_manage
@@ -255,20 +250,34 @@ module DevLXC
255
250
  def create_users
256
251
  puts "Creating org, user, keys and knife.rb in /root/chef-repo/.chef"
257
252
  FileUtils.mkdir_p("#{@server.config_item('lxc.rootfs')}/root/chef-repo/.chef")
258
- knife_rb = "chef_server_url 'https://127.0.0.1/organizations/ponyville'\n"
259
- knife_rb += "node_name 'rainbowdash'\n"
260
- knife_rb += "client_key 'rainbowdash.pem'\n"
261
- knife_rb += "knife[:chef_repo_path] = Dir.pwd\n"
253
+ knife_rb = %Q(
254
+ current_dir = File.dirname(__FILE__)
255
+
256
+ chef_server_url "https://127.0.0.1/organizations/ponyville"
257
+
258
+ node_name "rainbowdash"
259
+ client_key "\#{current_dir}/rainbowdash.pem"
260
+
261
+ validation_client_name "ponyville-validator"
262
+ validation_key "\#{current_dir}/ponyville-validator.pem"
263
+
264
+ cookbook_path Dir.pwd + "/cookbooks"
265
+ knife[:chef_repo_path] = Dir.pwd
266
+ )
262
267
  IO.write("#{@server.config_item('lxc.rootfs')}/root/chef-repo/.chef/knife.rb", knife_rb)
263
268
  case @chef_server_type
264
269
  when 'private-chef'
265
270
  # give time for all services to come up completely
266
271
  sleep 60
267
- pivotal_rb = "chef_server_root 'https://127.0.0.1/'\n"
268
- pivotal_rb += "chef_server_url 'https://127.0.0.1/'\n"
269
- pivotal_rb += "node_name 'pivotal'\n"
270
- pivotal_rb += "client_key '/etc/opscode/pivotal.pem'\n"
271
- pivotal_rb += "knife[:chef_repo_path] = Dir.pwd\n"
272
+ pivotal_rb = %Q(
273
+ chef_server_root "https://127.0.0.1/"
274
+ chef_server_url "https://127.0.0.1/"
275
+
276
+ node_name "pivotal"
277
+ client_key "/etc/opscode/pivotal.pem"
278
+
279
+ knife[:chef_repo_path] = Dir.pwd
280
+ )
272
281
  IO.write("#{@server.config_item('lxc.rootfs')}/root/chef-repo/.chef/pivotal.rb", pivotal_rb)
273
282
  @server.run_command("/opt/opscode/embedded/bin/gem install knife-opc --no-ri --no-rdoc")
274
283
  @server.run_command("/opt/opscode/embedded/bin/knife opc org create ponyville ponyville --filename /root/chef-repo/.chef/ponyville-validator.pem -c /root/chef-repo/.chef/pivotal.rb")
data/lib/dev-lxc/cli.rb CHANGED
@@ -37,6 +37,12 @@ module DevLXC::CLI
37
37
  puts get_cluster(options[:config]).abspath(rootfs_path).join(" ")
38
38
  end
39
39
 
40
+ desc "chef-repo", "Creates a chef-repo in the current directory using files from the cluster's backend /root/chef-repo"
41
+ option :config, :aliases => "-c", :desc => "Specify a cluster's YAML config file. ./dev-lxc.yaml will be used by default"
42
+ def chef_repo
43
+ get_cluster(options[:config]).chef_repo
44
+ end
45
+
40
46
  desc "run_command [COMMAND]", "Runs a command in each Chef server in a cluster"
41
47
  option :config, :aliases => "-c", :desc => "Specify a cluster's YAML config file. ./dev-lxc.yaml will be used by default"
42
48
  def run_command(command)
@@ -57,15 +63,15 @@ module DevLXC::CLI
57
63
 
58
64
  desc "destroy", "Destroy a cluster's Chef servers"
59
65
  option :config, :aliases => "-c", :desc => "Specify a cluster's YAML config file. ./dev-lxc.yaml will be used by default"
60
- option :unique, :aliases => "-u", :type => :boolean, :desc => "Also destroy the cluster's unique base containers"
61
- option :shared, :aliases => "-s", :type => :boolean, :desc => "Also destroy the cluster's shared base container"
62
- option :platform, :aliases => "-p", :type => :boolean, :desc => "Also destroy the cluster's platform base container"
66
+ option :unique, :aliases => "-u", :type => :boolean, :desc => "Also destroy the cluster's unique containers"
67
+ option :shared, :aliases => "-s", :type => :boolean, :desc => "Also destroy the cluster's shared container"
68
+ option :platform, :aliases => "-p", :type => :boolean, :desc => "Also destroy the cluster's platform container"
63
69
  def destroy
64
70
  cluster = get_cluster(options[:config])
65
71
  cluster.destroy
66
- cluster.destroy_base_container(:unique) if options[:unique]
67
- cluster.destroy_base_container(:shared) if options[:shared]
68
- cluster.destroy_base_container(:platform) if options[:platform]
72
+ cluster.destroy_container(:unique) if options[:unique]
73
+ cluster.destroy_container(:shared) if options[:shared]
74
+ cluster.destroy_container(:platform) if options[:platform]
69
75
  end
70
76
  end
71
77
 
@@ -111,35 +117,35 @@ module DevLXC::CLI
111
117
 
112
118
  desc "destroy [NAME]", "Destroy a cluster's Chef server"
113
119
  option :config, :aliases => "-c", :desc => "Specify a cluster's YAML config file. ./dev-lxc.yaml will be used by default"
114
- option :unique, :aliases => "-u", :type => :boolean, :desc => "Also destroy the server's unique base container"
115
- option :shared, :aliases => "-s", :type => :boolean, :desc => "Also destroy the server's shared base container"
116
- option :platform, :aliases => "-p", :type => :boolean, :desc => "Also destroy the server's platform base container"
120
+ option :unique, :aliases => "-u", :type => :boolean, :desc => "Also destroy the server's unique container"
121
+ option :shared, :aliases => "-s", :type => :boolean, :desc => "Also destroy the server's shared container"
122
+ option :platform, :aliases => "-p", :type => :boolean, :desc => "Also destroy the server's platform container"
117
123
  def destroy(name)
118
124
  server = get_server(name, options[:config])
119
125
  server.destroy
120
- server.destroy_base_container(:unique) if options[:unique]
121
- server.destroy_base_container(:shared) if options[:shared]
122
- server.destroy_base_container(:platform) if options[:platform]
126
+ server.destroy_container(:unique) if options[:unique]
127
+ server.destroy_container(:shared) if options[:shared]
128
+ server.destroy_container(:platform) if options[:platform]
123
129
  end
124
130
  end
125
131
 
126
132
  class DevLXC < Thor
127
- desc "create [BASE_PLATFORM]", "Create a base platform"
128
- def create(base_platform=nil)
129
- base_platforms = %w(b-ubuntu-1004 b-ubuntu-1204 b-ubuntu-1404 b-centos-5 b-centos-6)
130
- if base_platform.nil? || ! base_platforms.include?(base_platform)
131
- base_platforms_with_index = base_platforms.map.with_index{ |a, i| [i+1, *a]}
132
- print_table base_platforms_with_index
133
- selection = ask("Which base platform do you want to create?", :limited_to => base_platforms_with_index.map{|c| c[0].to_s})
134
- base_platform = base_platforms[selection.to_i - 1]
133
+ desc "create [PLATFORM_CONTAINER_NAME]", "Create a platform container"
134
+ def create(platform_container_name=nil)
135
+ platform_container_names = %w(p-ubuntu-1204 p-ubuntu-1404 p-centos-5 p-centos-6)
136
+ if platform_container_name.nil? || ! platform_container_names.include?(platform_container_name)
137
+ platform_container_names_with_index = platform_container_names.map.with_index{ |a, i| [i+1, *a]}
138
+ print_table platform_container_names_with_index
139
+ selection = ask("Which platform container do you want to create?", :limited_to => platform_container_names_with_index.map{|c| c[0].to_s})
140
+ platform_container_name = platform_container_names[selection.to_i - 1]
135
141
  end
136
- ::DevLXC.create_base_platform(base_platform)
142
+ ::DevLXC.create_platform_container(platform_container_name)
137
143
  end
138
144
 
139
- desc "cluster SUBCOMMAND ...ARGS", "manage Chef cluster"
145
+ desc "cluster SUBCOMMAND ...ARGS", "Manage Chef cluster"
140
146
  subcommand "cluster", Cluster
141
147
 
142
- desc "server SUBCOMMAND ...ARGS", "manage Chef server"
148
+ desc "server SUBCOMMAND ...ARGS", "Manage Chef server"
143
149
  subcommand "server", Server
144
150
  end
145
151
  end
@@ -37,8 +37,13 @@ module DevLXC
37
37
  end
38
38
  mounts.each do |mount|
39
39
  raise "Mount source #{mount.split.first} does not exist." unless File.exists?(mount.split.first)
40
- puts "Adding mount entry #{mount}"
41
- self.set_config_item("lxc.mount.entry", "#{mount} none bind,optional,create=dir 0 0 ## dev-lxc ##")
40
+ if preserved_mounts.any? { |m| m.start_with?("#{mount} ") }
41
+ puts "Skipping mount entry #{mount}, it already exists"
42
+ next
43
+ else
44
+ puts "Adding mount entry #{mount}"
45
+ self.set_config_item("lxc.mount.entry", "#{mount} none bind,optional,create=dir 0 0 ## dev-lxc ##")
46
+ end
42
47
  end
43
48
  self.save_config
44
49
  end
@@ -1,3 +1,3 @@
1
1
  module DevLXC
2
- VERSION = "0.2.5"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/dev-lxc.rb CHANGED
@@ -6,60 +6,56 @@ require "dev-lxc/chef-server"
6
6
  require "dev-lxc/chef-cluster"
7
7
 
8
8
  module DevLXC
9
- def self.create_base_platform(base_platform_name)
10
- base_platform = DevLXC::Container.new(base_platform_name)
11
- if base_platform.defined?
12
- puts "Using existing container #{base_platform.name}"
13
- return base_platform
9
+ def self.create_platform_container(platform_container_name)
10
+ platform_container = DevLXC::Container.new(platform_container_name)
11
+ if platform_container.defined?
12
+ puts "Using existing platform container #{platform_container.name}"
13
+ return platform_container
14
14
  end
15
- puts "Creating container #{base_platform.name}"
16
- case base_platform.name
17
- when "b-ubuntu-1004"
18
- base_platform.create("download", "btrfs", 0, ["-d", "ubuntu", "-r", "lucid", "-a", "amd64"])
19
- when "b-ubuntu-1204"
20
- base_platform.create("download", "btrfs", 0, ["-d", "ubuntu", "-r", "precise", "-a", "amd64"])
21
- when "b-ubuntu-1404"
22
- base_platform.create("download", "btrfs", 0, ["-d", "ubuntu", "-r", "trusty", "-a", "amd64"])
23
- when "b-centos-5"
24
- base_platform.create("centos", "btrfs", 0, ["-R", "5"])
25
- when "b-centos-6"
26
- base_platform.create("download", "btrfs", 0, ["-d", "centos", "-r", "6", "-a", "amd64"])
15
+ puts "Creating platform container #{platform_container.name}"
16
+ case platform_container.name
17
+ when "p-ubuntu-1004"
18
+ platform_container.create("download", "btrfs", 0, ["-d", "ubuntu", "-r", "lucid", "-a", "amd64"])
19
+ when "p-ubuntu-1204"
20
+ platform_container.create("download", "btrfs", 0, ["-d", "ubuntu", "-r", "precise", "-a", "amd64"])
21
+ when "p-ubuntu-1404"
22
+ platform_container.create("download", "btrfs", 0, ["-d", "ubuntu", "-r", "trusty", "-a", "amd64"])
23
+ when "p-centos-5"
24
+ platform_container.create("centos", "btrfs", 0, ["-R", "5"])
25
+ when "p-centos-6"
26
+ platform_container.create("download", "btrfs", 0, ["-d", "centos", "-r", "6", "-a", "amd64"])
27
27
  end
28
- # TODO when LXC 1.0.2 is released and the following test is replaced with #config_item("lxc.mount.auto")
29
- # then this #save_config can be removed
30
- base_platform.save_config
31
- # TODO when LXC 1.0.2 is released the following test can be done using #config_item("lxc.mount.auto")
32
- unless IO.readlines(base_platform.config_file_name).select { |line| line.start_with?("lxc.mount.auto") }.empty?
33
- base_platform.set_config_item("lxc.mount.auto", "proc:rw sys:rw")
28
+ unless platform_container.config_item("lxc.mount.auto").empty?
29
+ platform_container.set_config_item("lxc.mount.auto", "proc:rw sys:rw")
34
30
  end
35
31
  hwaddr = '00:16:3e:' + Digest::SHA1.hexdigest(Time.now.to_s).slice(0..5).unpack('a2a2a2').join(':')
36
- puts "Setting #{base_platform.name} container's lxc.network.0.hwaddr to #{hwaddr}"
37
- base_platform.set_config_item("lxc.network.0.hwaddr", hwaddr)
38
- base_platform.save_config
39
- base_platform.start
40
- puts "Installing packages in container #{base_platform.name}"
41
- case base_platform.name
42
- when "b-ubuntu-1004"
32
+ puts "Setting #{platform_container.name} platform container's lxc.network.0.hwaddr to #{hwaddr}"
33
+ platform_container.set_config_item("lxc.network.0.hwaddr", hwaddr)
34
+ platform_container.save_config
35
+ platform_container.start
36
+ puts "Installing packages in platform container #{platform_container.name}"
37
+ case platform_container.name
38
+ when "p-ubuntu-1004"
43
39
  # Disable certain sysctl.d files in Ubuntu 10.04, they cause `start procps` to fail
44
- if File.exist?("#{base_platform.config_item('lxc.rootfs')}/etc/sysctl.d/10-console-messages.conf")
45
- FileUtils.mv("#{base_platform.config_item('lxc.rootfs')}/etc/sysctl.d/10-console-messages.conf",
46
- "#{base_platform.config_item('lxc.rootfs')}/etc/sysctl.d/10-console-messages.conf.orig")
40
+ if File.exist?("#{platform_container.config_item('lxc.rootfs')}/etc/sysctl.d/10-console-messages.conf")
41
+ FileUtils.mv("#{platform_container.config_item('lxc.rootfs')}/etc/sysctl.d/10-console-messages.conf",
42
+ "#{platform_container.config_item('lxc.rootfs')}/etc/sysctl.d/10-console-messages.conf.orig")
47
43
  end
48
- base_platform.run_command("apt-get update")
49
- base_platform.run_command("apt-get install -y standard^ server^ vim-nox emacs23-nox curl tree")
50
- when "b-ubuntu-1204", "b-ubuntu-1404"
51
- base_platform.run_command("apt-get update")
52
- base_platform.run_command("apt-get install -y standard^ server^ vim-nox emacs23-nox tree")
53
- when "b-centos-5"
44
+ platform_container.run_command("apt-get update")
45
+ platform_container.run_command("apt-get install -y standard^ server^ vim-nox emacs23-nox curl tree")
46
+ when "p-ubuntu-1204", "p-ubuntu-1404"
47
+ platform_container.run_command("apt-get update")
48
+ platform_container.run_command("apt-get install -y standard^ server^ vim-nox emacs23-nox tree")
49
+ when "p-centos-5"
54
50
  # downgrade openssl temporarily to overcome an install bug
55
51
  # reference: http://www.hack.net.br/blog/2014/02/12/openssl-conflicts-with-file-from-package-openssl/
56
- base_platform.run_command("yum downgrade -y openssl")
57
- base_platform.run_command("yum install -y @base @core vim-enhanced emacs-nox tree")
58
- when "b-centos-6"
59
- base_platform.run_command("yum install -y @base @core vim-enhanced emacs-nox tree")
52
+ platform_container.run_command("yum downgrade -y openssl")
53
+ platform_container.run_command("yum install -y @base @core vim-enhanced emacs-nox tree")
54
+ when "p-centos-6"
55
+ platform_container.run_command("yum install -y @base @core vim-enhanced emacs-nox tree")
60
56
  end
61
- base_platform.stop
62
- return base_platform
57
+ platform_container.stop
58
+ return platform_container
63
59
  end
64
60
 
65
61
  def self.assign_ip_address(ipaddress, container_name, hwaddr)
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: 0.2.5
4
+ version: 0.3.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: 2015-01-26 00:00:00.000000000 Z
11
+ date: 2015-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 1.0.1
61
+ version: 1.0.2
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 1.0.1
68
+ version: 1.0.2
69
69
  description: A tool for creating Chef server clusters using LXC containers
70
70
  email:
71
71
  - jeremiah@getchef.com
@@ -81,7 +81,6 @@ files:
81
81
  - Rakefile
82
82
  - bin/dev-lxc
83
83
  - dev-lxc.gemspec
84
- - files/configs/ha.yaml
85
84
  - files/configs/open-source.yaml
86
85
  - files/configs/standalone.yaml
87
86
  - files/configs/tier.yaml
@@ -111,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
110
  version: '0'
112
111
  requirements: []
113
112
  rubyforge_project:
114
- rubygems_version: 2.4.1
113
+ rubygems_version: 2.4.4
115
114
  signing_key:
116
115
  specification_version: 4
117
116
  summary: A tool for creating Chef server clusters using LXC containers
@@ -1,31 +0,0 @@
1
- base_platform: b-ubuntu-1404
2
- topology: ha
3
- api_fqdn: chef-ha.lxc
4
- mounts:
5
- - /dev-shared dev-shared
6
- packages:
7
- server: /dev-shared/chef-packages/cs/chef-server-core_12.0.1-1_amd64.deb
8
- # reporting: /dev-shared/chef-packages/cs/reporting/opscode-reporting_1.2.3-1_amd64.deb
9
- # push-jobs-server: /dev-shared/chef-packages/cs/push-jobs-server/opscode-push-jobs-server_1.1.6-1_amd64.deb
10
- # manage: /dev-shared/chef-packages/cs/manage/opscode-manage_1.6.2-1_amd64.deb
11
- servers:
12
- be1-ha.lxc:
13
- role: backend
14
- ipaddress: 10.0.3.206
15
- bootstrap: true
16
- cluster_ipaddress: 192.168.0.5
17
- be2-ha.lxc:
18
- role: backend
19
- ipaddress: 10.0.3.207
20
- cluster_ipaddress: 192.168.0.6
21
- fe1-ha.lxc:
22
- role: frontend
23
- ipaddress: 10.0.3.208
24
- # fe2-ha.lxc:
25
- # role: frontend
26
- # ipaddress: 10.0.3.209
27
- backend_vip:
28
- be-ha.lxc:
29
- ipaddress: 10.0.3.210
30
- device: eth0
31
- heartbeat_device: eth1