vagrant-compose 0.2.3 → 0.2.4
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 +12 -1
- data/README.md +38 -34
- data/lib/locales/en.yml +4 -0
- data/lib/vagrant/compose/config.rb +44 -29
- data/lib/vagrant/compose/errors.rb +4 -0
- data/lib/vagrant/compose/util/cluster.rb +80 -49
- data/lib/vagrant/compose/util/node_group.rb +33 -33
- data/lib/vagrant/compose/version.rb +2 -2
- data/provisioning/group_vars/zookeeper.yml +2 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f830b936e191533e4b7af81b6a8a28aff5895b65
|
4
|
+
data.tar.gz: 340bfc23e34b5538bf2efd653042e851594bb2f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d898460561c00f26860490b0ef1f1f60bc0244cef3b049bc3faffcbc69b705d82b2a291c21c1955ace7850ca505a44e92bb5d6160490921cbc348f77d18d524d
|
7
|
+
data.tar.gz: 6f28b559521b5ee1a340b2dc4e09c7d6cc03aef6c6760c0332437f437c837d700fe1400f522c3c51a444eb5e0e5eb19c7cfbcd54b80e6b197d2430499ae06eae
|
data/CHANGELOG.md
CHANGED
@@ -2,9 +2,10 @@
|
|
2
2
|
|
3
3
|
* Initial release.
|
4
4
|
|
5
|
+
|
5
6
|
# 0.2.2 (December 31, 2015)
|
6
7
|
|
7
|
-
breaking changes!
|
8
|
+
breaking changes!
|
8
9
|
* nodes instances number defined into node method (instances attributes removed)
|
9
10
|
* cluster.nodes return only nodes (before nodes with index were returned)
|
10
11
|
|
@@ -12,6 +13,8 @@ other changes:
|
|
12
13
|
* Improved documentation.
|
13
14
|
* cluster domain now is optional
|
14
15
|
* nodes code block now is optional
|
16
|
+
* improved detection of multimachine_filter
|
17
|
+
* minor fixes
|
15
18
|
|
16
19
|
# 0.2.3 (April 2, 2016)
|
17
20
|
|
@@ -20,3 +23,11 @@ other changes:
|
|
20
23
|
other changes:
|
21
24
|
* Documented cluster.debug feature
|
22
25
|
* Improved code inline documentation
|
26
|
+
|
27
|
+
# 0.2.4 (June 26, 2016)
|
28
|
+
|
29
|
+
* issues #3 Now vagrant up and vagrant provision support also a list of machine name / regular expressions.
|
30
|
+
* pr #3 Support changing ansible_playbook_path & clean up path management
|
31
|
+
|
32
|
+
NB. breaking change
|
33
|
+
ansible_group_vars_path and ansible_host_vars_path are not supported anymore
|
data/README.md
CHANGED
@@ -85,7 +85,9 @@ See following chapters for more details.
|
|
85
85
|
|
86
86
|
## Configuring the cluster
|
87
87
|
|
88
|
-
|
88
|
+
Each cluster can be named passing a value to `cluster.compose` method, and the default behaviour is that name of vagrant boxes and hostnames will be prefixed by such name; if cluster name will be set to nil or "", vagrant boxes and hostnames will be composed without prefix.
|
89
|
+
|
90
|
+
Apart for cluster name, there are several options to customize the cluster definition.
|
89
91
|
|
90
92
|
### Defining cluster attributes
|
91
93
|
|
@@ -96,7 +98,7 @@ You can set set cluster attributes in the block of code that is passed as a seco
|
|
96
98
|
``` ruby
|
97
99
|
config.cluster.compose('test') do |c|
|
98
100
|
c.box = "centos/7"
|
99
|
-
...
|
101
|
+
...
|
100
102
|
end
|
101
103
|
```
|
102
104
|
|
@@ -104,7 +106,7 @@ Following cluster attributes are available:
|
|
104
106
|
|
105
107
|
- **box**, [String], default = 'ubuntu/trusty64'
|
106
108
|
|
107
|
-
Sets the base box for nodes, a.k.a the image that will be used to spin up the machine; please note that the base box can be
|
109
|
+
Sets the base box for nodes, a.k.a the image that will be used to spin up the machine; please note that the base box can be customized also for each set of nodes (see Defining set of nodes).
|
108
110
|
|
109
111
|
|
110
112
|
- **domain**, [String], default = 'vagrant'
|
@@ -125,12 +127,12 @@ Set of nodes can be defined in the block of code that is passed as a second para
|
|
125
127
|
``` ruby
|
126
128
|
config.cluster.compose('test') do |c|
|
127
129
|
...
|
128
|
-
c.nodes(3, '
|
129
|
-
...
|
130
|
+
c.nodes(3, 'consul-agents')
|
131
|
+
...
|
130
132
|
end
|
131
133
|
```
|
132
134
|
|
133
|
-
The first parameter of the `nodes` method is the number of nodes in the set, while the second parameter is the name of the set; `nodes` accepts an optional third parameter, allowing to define a block of code where it is possible to
|
135
|
+
The first parameter of the `nodes` method is the number of nodes in the set, while the second parameter is the name of the set; `nodes` accepts an optional third parameter, allowing to define a block of code where it is possible to customize several attributes of the set of nodes itself:
|
134
136
|
|
135
137
|
``` ruby
|
136
138
|
config.cluster.compose('test') do |c|
|
@@ -138,7 +140,7 @@ config.cluster.compose('test') do |c|
|
|
138
140
|
c.nodes(3, 'zookeeper') do |n|
|
139
141
|
n.box = "centos/7"
|
140
142
|
end
|
141
|
-
...
|
143
|
+
...
|
142
144
|
end
|
143
145
|
```
|
144
146
|
|
@@ -159,8 +161,6 @@ Please note that all the available attributes can be set to:
|
|
159
161
|
return "#{group_name}#{node_index + 1}"
|
160
162
|
}
|
161
163
|
```
|
162
|
-
|
163
|
-
|
164
164
|
|
165
165
|
Following set of nodes attributes are available:
|
166
166
|
|
@@ -171,15 +171,13 @@ Following set of nodes attributes are available:
|
|
171
171
|
- **boxname**, [String|String_Generator], default = `"#{group_name}#{node_index + 1}"`
|
172
172
|
|
173
173
|
Sets the box name (a.k.a. the name of the machine in VirtualBox/VMware) for each node in this set.
|
174
|
-
|
175
|
-
Note: when generating nodes, the resulting boxname will be automatically prefixed by `"#{cluster_name}-"`.
|
174
|
+
Note: when generating nodes, if cluster name not equals to nil or empty string the resulting boxname will be automatically prefixed by `"#{cluster_name}-"` if cluster name not equals to nil or empty string.
|
176
175
|
|
177
176
|
- **hostname**, [String|String_Generator], default = `"#{group_name}#{node_index + 1}"`
|
178
177
|
|
179
178
|
Sets the hostname for each node in this set.
|
180
179
|
|
181
|
-
Note: when generating nodes, the resulting hostname will be automatically prefixed by `"#{cluster_name}-"`; additionally the **fqdn** attribute will be computed by concatenating `".#{cluster.domain}"`, if defined (if `domain` is not defined, fqdn will be the same of hostname).
|
182
|
-
|
180
|
+
Note: when generating nodes, if cluster name not equals to nil or empty string the resulting hostname will be automatically prefixed by `"#{cluster_name}-"`; additionally the **fqdn** attribute will be computed by concatenating `".#{cluster.domain}"`, if defined (if `domain` is not defined, fqdn will be the same of hostname).
|
183
181
|
|
184
182
|
- **aliases**, [Array(String)|Array(String)_Generator], default = `[]`
|
185
183
|
|
@@ -187,25 +185,21 @@ Following set of nodes attributes are available:
|
|
187
185
|
|
188
186
|
Note: when generating nodes, aliases will be automatically concatenated into a string, comma separated.
|
189
187
|
|
190
|
-
|
191
188
|
- **ip**, [String|String_Generator], default = `"172.31.#{group_index}.#{100 + node_index + 1}"`
|
192
189
|
|
193
190
|
Sets the ip for for each node in this set.
|
194
191
|
|
195
|
-
|
196
192
|
- **cpus**, [Integer|Integer_Generator], default = `1`
|
197
193
|
|
198
194
|
Sets the number of cpus for each node in this set.
|
199
195
|
|
200
|
-
|
201
196
|
- **memory**, [Integer|Integer_Generator], default = `256` (MB)
|
202
197
|
|
203
198
|
Sets the memory allocated for each node in this set.
|
204
199
|
|
205
|
-
|
206
200
|
- **attributes**, [Hash(String, obj)|Hash(String, obj)_Generator], default = `{}`
|
207
201
|
|
208
|
-
Allows to provide
|
202
|
+
Allows to provide custom additional attributes for each node in this set.
|
209
203
|
|
210
204
|
> Please note that some attribute, like boxname, hostname, ip, *must* be different for each node in the set (and in the cluster).
|
211
205
|
>
|
@@ -221,29 +215,34 @@ The resulting list of nodes is stored in the `config.cluster.nodes` variable; ea
|
|
221
215
|
- **boxname**
|
222
216
|
- **hostname**
|
223
217
|
- **fqdn**
|
224
|
-
|
225
|
-
|
226
218
|
- **aliases**
|
227
|
-
|
228
|
-
|
229
219
|
- **ip**
|
230
|
-
|
231
|
-
|
232
220
|
- **cpus**
|
233
|
-
|
234
|
-
|
235
221
|
- **memory**
|
236
|
-
|
237
|
-
|
238
222
|
- **attributes**
|
239
223
|
|
240
|
-
|
241
|
-
|
242
224
|
Two additional attributes will be automatically set for each node:
|
243
225
|
|
244
226
|
- **index**, [integer (zero based)], uniquely assigned to each node in the cluster
|
245
227
|
- **group_index**, [integer (zero based)], uniquely assigned to each node in a set of nodes
|
246
228
|
|
229
|
+
## Checking cluster configuration
|
230
|
+
|
231
|
+
It is possible to check the resulting list of nodes by using the `compose.debug` command:
|
232
|
+
|
233
|
+
``` ruby
|
234
|
+
Vagrant.configure(2) do |config|
|
235
|
+
#cluster definition
|
236
|
+
config.cluster.compose('test') do |c|
|
237
|
+
...
|
238
|
+
end
|
239
|
+
|
240
|
+
config.cluster.debug
|
241
|
+
end
|
242
|
+
```
|
243
|
+
|
244
|
+
Main information about nodes will be printed into the sequence of vagrant messages.
|
245
|
+
|
247
246
|
## Creating nodes
|
248
247
|
|
249
248
|
Given the list of nodes stored in the `config.cluster.nodes` variable, it is possible to create a multi-machine environment by iterating over the list:
|
@@ -380,12 +379,9 @@ Ansible host vars will be stored into yaml files saved into `{cluster.ansible_pl
|
|
380
379
|
|
381
380
|
Group vars and host var generation by design can operate only with the set of information that comes with a groups of nodes or a single node.
|
382
381
|
|
383
|
-
However, sometimes, it is necessary to share some information across group of nodes
|
384
|
-
|
382
|
+
However, sometimes, it is necessary to share some information across group of nodes.
|
385
383
|
This can be achieved by setting one or more context_vars generator for each ansible_groups.
|
386
384
|
|
387
|
-
> Context_vars generator are always executed before group_vars and host_vars generators; the resulting context, is given in input to group_vars and host_vars generators.
|
388
|
-
|
389
385
|
For instance, when building a [Consul](https://consul.io/) cluster, all the `consul-agent` nodes should be configured with the ip - the list of ip - to be used when joining the cluster; such list can be generated from the list of nodes in the `consul-server` set of nodes, and stored in a context_vars:
|
390
386
|
|
391
387
|
``` ruby
|
@@ -398,6 +394,8 @@ config.cluster.compose('test') do |c|
|
|
398
394
|
end
|
399
395
|
```
|
400
396
|
|
397
|
+
> Context_vars generator are always executed before group_vars and host_vars generators; the resulting context, is given in input to group_vars and host_vars generators.
|
398
|
+
|
401
399
|
Then, you can use the above context var when generating group_vars for nodes in the `consul-agent` group.
|
402
400
|
|
403
401
|
``` ruby
|
@@ -436,3 +434,9 @@ end
|
|
436
434
|
|
437
435
|
```
|
438
436
|
|
437
|
+
# Additional notes
|
438
|
+
Vagrant compose will play nicely with all vagrant commands.
|
439
|
+
|
440
|
+
For instance, When using vagrant tageting a single machine, like f.i. `vagrant up mesos-master1`, the `cluster.ansible_groups` variable will include only the given machine.
|
441
|
+
|
442
|
+
Happy vagrant-compose!
|
data/lib/locales/en.yml
CHANGED
@@ -4,7 +4,7 @@ require_relative "util/cluster"
|
|
4
4
|
|
5
5
|
module VagrantPlugins
|
6
6
|
module Compose
|
7
|
-
|
7
|
+
|
8
8
|
# Vagrant compose plugin definition class.
|
9
9
|
# This plugins allows easy configuration of a data structure that can be used as a recipe
|
10
10
|
# for setting up and provisioning a vagrant cluster composed by several machines with different
|
@@ -17,33 +17,48 @@ module VagrantPlugins
|
|
17
17
|
# After executing compose, it returns the ansible_groups configuration for provisioning nodes in the cluster.
|
18
18
|
attr_reader :ansible_groups
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
20
|
+
def initialize
|
21
|
+
@nodes = {}
|
22
|
+
@ansible_groups = {}
|
23
|
+
end
|
24
|
+
|
25
|
+
# Implements cluster creation, through the execution of the give code.
|
26
|
+
def compose (name, &block)
|
27
|
+
# create the cluster (the data structure representing the cluster)
|
28
|
+
@cluster = Cluster.new(name)
|
29
|
+
begin
|
30
|
+
# executes the cluster configuration code
|
31
|
+
block.call(@cluster)
|
32
|
+
rescue Exception => e
|
33
|
+
raise VagrantPlugins::Compose::Errors::ClusterInitializeError, :message => e.message, :cluster_name => name
|
34
|
+
end
|
35
|
+
# tranform cluster configuration into a list of nodes/ansible groups to be used for
|
36
|
+
@nodes, @ansible_groups = @cluster.compose
|
37
|
+
end
|
38
|
+
|
39
|
+
# Implements cluster creation, through the execution of the give code.
|
40
|
+
def from (file)
|
41
|
+
puts "from #{file}"
|
42
|
+
begin
|
43
|
+
a = `xxxxx`
|
44
|
+
puts "get #{a}"
|
45
|
+
rescue Exception => e
|
46
|
+
raise VagrantPlugins::Compose::Errors::PyComposeError, :message => e.message
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
# tranform cluster configuration into a list of nodes/ansible groups to be used for
|
51
|
+
@nodes, @ansible_groups = @cluster.compose
|
52
|
+
end
|
53
|
+
|
54
|
+
# Implements a utility method that allows to check the list of nodes generated by compose.
|
55
|
+
def debug
|
56
|
+
puts "==> cluster #{@cluster.name} with #{nodes.size} nodes"
|
57
|
+
@nodes.each do |node|
|
58
|
+
puts " #{node.boxname} accessible as #{node.fqdn} #{node.aliases} #{node.ip} => [#{node.box}, #{node.cpus} cpus, #{node.memory} memory]"
|
59
|
+
end
|
60
|
+
puts " ansible_groups filtered by #{@cluster.multimachine_filter}" if not @cluster.multimachine_filter.empty?
|
61
|
+
end
|
47
62
|
end
|
48
63
|
end
|
49
|
-
end
|
64
|
+
end
|
@@ -5,35 +5,33 @@ module VagrantPlugins
|
|
5
5
|
module Compose
|
6
6
|
|
7
7
|
# This class defines a cluster, thas is a set of group of nodes, where nodes in each group has similar characteristics.
|
8
|
-
# Basically, a cluster is a data structure that can be used as a recipe for setting up and provisioning a
|
8
|
+
# Basically, a cluster is a data structure that can be used as a recipe for setting up and provisioning a
|
9
9
|
# vagrant cluster composed by several machines with different roles.
|
10
10
|
class Cluster
|
11
11
|
|
12
12
|
# The name of the cluster
|
13
13
|
attr_reader :name
|
14
14
|
|
15
|
-
# The default vagrant base box to be used for creating vagrant machines in this cluster.
|
15
|
+
# The default vagrant base box to be used for creating vagrant machines in this cluster.
|
16
16
|
# This setting can be changed at group/node level
|
17
17
|
attr_accessor :box
|
18
|
-
|
18
|
+
|
19
19
|
# The network domain to wich the cluster belongs (used for computing nodes fqdn)
|
20
20
|
attr_accessor :domain
|
21
|
-
|
21
|
+
|
22
22
|
|
23
23
|
# The root path for ansible playbook; it is used as a base path for computing ansible_group_vars and ansible_host_vars
|
24
24
|
# It defaults to current directory/provisioning
|
25
25
|
attr_accessor :ansible_playbook_path
|
26
|
-
|
27
|
-
#
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
# It default to ansible_playbook_path/host_vars
|
33
|
-
attr_accessor :ansible_host_vars
|
26
|
+
|
27
|
+
# A dictionary, allowing to setup ansible_group_vars generators foreach node_group
|
28
|
+
attr_reader :ansible_group_vars
|
29
|
+
|
30
|
+
# A dictionary, allowing to setup ansible_host_vars generators foreach node_group
|
31
|
+
attr_reader :ansible_host_vars
|
34
32
|
|
35
33
|
# A dictionary, allowing to setup context vars to be uses is value_generators when composing nodes
|
36
|
-
|
34
|
+
attr_reader :ansible_context_vars
|
37
35
|
|
38
36
|
# A variable that reflects if vagrant is tageting a single machine, like f.i. when executing vagrant up machine-name
|
39
37
|
attr_reader :multimachine_filter
|
@@ -47,13 +45,11 @@ module VagrantPlugins
|
|
47
45
|
@ansible_host_vars = {}
|
48
46
|
@multimachine_filter = ""
|
49
47
|
@ansible_playbook_path = File.join(Dir.pwd, 'provisioning')
|
50
|
-
@ansible_group_vars_path = File.join(@ansible_playbook_path, 'group_vars')
|
51
|
-
@ansible_host_vars_path = File.join(@ansible_playbook_path, 'host_vars')
|
52
48
|
|
53
|
-
@name = name
|
49
|
+
@name = name
|
54
50
|
@box = 'ubuntu/trusty64'
|
55
51
|
@domain = 'vagrant'
|
56
|
-
end
|
52
|
+
end
|
57
53
|
|
58
54
|
# Metodo per la creazione di un gruppo di nodi; in fase di creazione, il blocco inizializza
|
59
55
|
# i valori/le expressioni da utilizzarsi nella valorizzazione degli attributi dei nodi in fase di compose.
|
@@ -64,7 +60,7 @@ module VagrantPlugins
|
|
64
60
|
raise RuntimeError, "Nodes #{name} already exists in this cluster." unless not @node_groups.has_key?(name)
|
65
61
|
|
66
62
|
@node_groups[name] = NodeGroup.new(@group_index, instances, name)
|
67
|
-
@node_groups[name].box = @box
|
63
|
+
@node_groups[name].box = @box
|
68
64
|
@node_groups[name].boxname = lambda { |group_index, group_name, node_index| return "#{group_name}#{node_index + 1}" }
|
69
65
|
@node_groups[name].hostname = lambda { |group_index, group_name, node_index| return "#{group_name}#{node_index + 1}" }
|
70
66
|
@node_groups[name].aliases = []
|
@@ -74,22 +70,22 @@ module VagrantPlugins
|
|
74
70
|
@node_groups[name].ansible_groups = []
|
75
71
|
@node_groups[name].attributes = {}
|
76
72
|
|
77
|
-
@group_index += 1
|
73
|
+
@group_index += 1
|
78
74
|
|
79
75
|
block.call(@node_groups[name]) if block_given?
|
80
|
-
end
|
76
|
+
end
|
81
77
|
|
82
78
|
# Prepara il provisioning del cluster
|
83
|
-
def compose
|
79
|
+
def compose
|
84
80
|
|
85
|
-
@multimachine_filter =
|
81
|
+
@multimachine_filter = ((['up', 'provision'].include? ARGV[0]) && ARGV.length > 1) ? ARGV.drop(1) : [] # detect if running vagrant up/provision MACHINE
|
86
82
|
|
87
83
|
## Fase1: Creazione dei nodi
|
88
84
|
|
89
85
|
# sviluppa i vari gruppi di nodi, creando i singoli nodi
|
90
86
|
nodes = []
|
91
87
|
|
92
|
-
@node_groups.each do |key, group|
|
88
|
+
@node_groups.each do |key, group|
|
93
89
|
group.compose(@name, @domain, nodes.size) do |node|
|
94
90
|
nodes << node
|
95
91
|
end
|
@@ -102,11 +98,11 @@ module VagrantPlugins
|
|
102
98
|
node.ansible_groups.each do |ansible_group|
|
103
99
|
ansible_groups[ansible_group] = [] unless ansible_groups.has_key? (ansible_group)
|
104
100
|
ansible_groups[ansible_group] << node
|
105
|
-
end
|
101
|
+
end
|
106
102
|
end
|
107
103
|
|
108
104
|
## Fase2: Configurazione provisioning del cluster via Ansible
|
109
|
-
# Ogni nodo diventerà una vm su cui sarà fatto il provisioning, ovvero un host nell'inventory di ansible
|
105
|
+
# Ogni nodo diventerà una vm su cui sarà fatto il provisioning, ovvero un host nell'inventory di ansible
|
110
106
|
# Ad ogni gruppo corrispondono nodi con caratteristiche simili
|
111
107
|
|
112
108
|
# genearazione inventory file per ansible, aka ansible_groups in Vagrant (NB. 1 group = 1 gruppo ansible)
|
@@ -114,8 +110,8 @@ module VagrantPlugins
|
|
114
110
|
ansible_groups.each do |ansible_group, ansible_group_nodes|
|
115
111
|
ansible_groups_provision[ansible_group] = []
|
116
112
|
ansible_group_nodes.each do |node|
|
117
|
-
ansible_groups_provision[ansible_group] << node.hostname if
|
118
|
-
end
|
113
|
+
ansible_groups_provision[ansible_group] << node.hostname if checkMultimachineFilter(node.boxname) #filter ansible groups if vagrant command on one node
|
114
|
+
end
|
119
115
|
end
|
120
116
|
ansible_groups_provision['all_groups:children'] = ansible_groups.keys
|
121
117
|
|
@@ -132,13 +128,13 @@ module VagrantPlugins
|
|
132
128
|
|
133
129
|
#genearazione context (NB. 1 group = 1 gruppo host ansible)
|
134
130
|
ansible_groups.each do |ansible_group, ansible_group_nodes|
|
135
|
-
|
136
131
|
# genero le variabili per il group
|
137
132
|
provisioners = @ansible_context_vars[ansible_group]
|
138
133
|
unless provisioners.nil?
|
134
|
+
|
139
135
|
# se necessario, normalizzo provisioner in array provisioners
|
140
|
-
provisioners = [ provisioners ] if not provisioners.respond_to?('each')
|
141
|
-
# per tutti i provisioners abbinati al ruolo
|
136
|
+
provisioners = [ provisioners ] if not provisioners.respond_to?('each')
|
137
|
+
# per tutti i provisioners abbinati al ruolo
|
142
138
|
provisioners.each do |provisioner|
|
143
139
|
begin
|
144
140
|
vars = provisioner.call(context, ansible_group_nodes)
|
@@ -148,14 +144,16 @@ module VagrantPlugins
|
|
148
144
|
rescue Exception => e
|
149
145
|
raise VagrantPlugins::Compose::Errors::ContextVarExpressionError, :message => e.message, :ansible_group => ansible_group
|
150
146
|
end
|
151
|
-
end
|
147
|
+
end
|
152
148
|
end
|
153
149
|
end
|
154
150
|
|
155
151
|
# cleanup ansible_group_vars files
|
156
152
|
# TODO: make safe
|
157
|
-
|
158
|
-
|
153
|
+
ansible_group_vars_path = File.join(@ansible_playbook_path, 'group_vars')
|
154
|
+
|
155
|
+
FileUtils.mkdir_p(ansible_group_vars_path) unless File.exists?(ansible_group_vars_path)
|
156
|
+
Dir.foreach(ansible_group_vars_path) {|f| fn = File.join(ansible_group_vars_path, f); File.delete(fn) if f.end_with?(".yml")}
|
159
157
|
|
160
158
|
#generazione ansible_group_vars file (NB. 1 group = 1 gruppo host ansible)
|
161
159
|
ansible_groups.each do |ansible_group, ansible_group_nodes|
|
@@ -164,8 +162,8 @@ module VagrantPlugins
|
|
164
162
|
provisioners = @ansible_group_vars[ansible_group]
|
165
163
|
unless provisioners.nil?
|
166
164
|
# se necessario, normalizzo provisioner in array provisioners
|
167
|
-
provisioners = [ provisioners ] if not provisioners.respond_to?('each')
|
168
|
-
# per tutti i provisioners abbinati al ruolo
|
165
|
+
provisioners = [ provisioners ] if not provisioners.respond_to?('each')
|
166
|
+
# per tutti i provisioners abbinati al ruolo
|
169
167
|
provisioners.each do |provisioner|
|
170
168
|
begin
|
171
169
|
vars = provisioner.call(context, ansible_group_nodes)
|
@@ -175,22 +173,24 @@ module VagrantPlugins
|
|
175
173
|
rescue Exception => e
|
176
174
|
raise VagrantPlugins::Compose::Errors::GroupVarExpressionError, :message => e.message, :ansible_group => ansible_group
|
177
175
|
end
|
178
|
-
end
|
176
|
+
end
|
179
177
|
end
|
180
178
|
|
181
179
|
# crea il file (se sono state generate delle variabili)
|
182
180
|
unless ansible_group_vars.empty?
|
183
|
-
# TODO: make safe
|
184
|
-
File.open(File.join(
|
181
|
+
# TODO: make safe
|
182
|
+
File.open(File.join(ansible_group_vars_path,"#{ansible_group}.yml") , 'w+') do |file|
|
185
183
|
file.puts YAML::dump(ansible_group_vars)
|
186
|
-
end
|
184
|
+
end
|
187
185
|
end
|
188
186
|
end
|
189
187
|
|
190
188
|
# cleanup ansible_host_vars files (NB. 1 nodo = 1 host)
|
191
189
|
# TODO: make safe
|
192
|
-
|
193
|
-
|
190
|
+
ansible_host_vars_path = File.join(@ansible_playbook_path, 'host_vars')
|
191
|
+
|
192
|
+
FileUtils.mkdir_p(ansible_host_vars_path) unless File.exists?(ansible_host_vars_path)
|
193
|
+
Dir.foreach(ansible_host_vars_path) {|f| fn = File.join(ansible_host_vars_path, f); File.delete(fn) if f.end_with?(".yml")}
|
194
194
|
|
195
195
|
#generazione ansible_host_vars file
|
196
196
|
nodes.each do |node|
|
@@ -201,7 +201,7 @@ module VagrantPlugins
|
|
201
201
|
provisioners = @ansible_host_vars[ansible_group]
|
202
202
|
unless provisioners.nil?
|
203
203
|
# se necessario, normalizzo provisioner in array provisioners
|
204
|
-
provisioners = [ provisioners ] if not provisioners.respond_to?('each')
|
204
|
+
provisioners = [ provisioners ] if not provisioners.respond_to?('each')
|
205
205
|
# per tutti i provisioners abbinati al gruppo
|
206
206
|
provisioners.each do |provisioner|
|
207
207
|
begin
|
@@ -212,23 +212,54 @@ module VagrantPlugins
|
|
212
212
|
rescue Exception => e
|
213
213
|
raise VagrantPlugins::Compose::Errors::HostVarExpressionError, :message => e.message, :host => node.hostname, :ansible_group => ansible_group
|
214
214
|
end
|
215
|
-
end
|
215
|
+
end
|
216
216
|
end
|
217
217
|
end
|
218
218
|
|
219
219
|
# crea il file (se sono state generate delle variabili)
|
220
220
|
unless ansible_host_vars.empty?
|
221
|
-
# TODO: make safe
|
222
|
-
File.open(File.join(
|
221
|
+
# TODO: make safe
|
222
|
+
File.open(File.join(ansible_host_vars_path,"#{node.hostname}.yml") , 'w+') do |file|
|
223
223
|
file.puts YAML::dump(ansible_host_vars)
|
224
|
-
end
|
224
|
+
end
|
225
225
|
end
|
226
226
|
end
|
227
227
|
|
228
228
|
return nodes, ansible_groups_provision
|
229
229
|
end
|
230
|
-
end
|
231
230
|
|
232
|
-
|
233
|
-
|
231
|
+
# Prepara il provisioning del cluster
|
232
|
+
def from(file)
|
233
|
+
puts "from #{file}"
|
234
|
+
begin
|
235
|
+
a = `ls`
|
236
|
+
puts "get #{a}"
|
237
|
+
rescue Exception => e
|
238
|
+
raise VagrantPlugins::Compose::Errors::PyComposeError, :message => e.message
|
239
|
+
end
|
240
|
+
end
|
234
241
|
|
242
|
+
def checkMultimachineFilter(boxname)
|
243
|
+
if @multimachine_filter.length > 0
|
244
|
+
@multimachine_filter.each do |name|
|
245
|
+
if pattern = name[/^\/(.+?)\/$/, 1]
|
246
|
+
# This is a regular expression name, so we convert to a regular
|
247
|
+
# expression and allow that sort of matching.
|
248
|
+
regex = Regexp.new(pattern)
|
249
|
+
return boxname =~ regex
|
250
|
+
else
|
251
|
+
# String name, just look for a specific VM
|
252
|
+
return boxname == name
|
253
|
+
end
|
254
|
+
end
|
255
|
+
else
|
256
|
+
# No name was given, so we return every VM in the order
|
257
|
+
# configured.
|
258
|
+
return true
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
end
|
263
|
+
|
264
|
+
end
|
265
|
+
end
|
@@ -6,58 +6,58 @@ module VagrantPlugins
|
|
6
6
|
# This class defines a group of nodes, representig a set of vagrant machines with similar characteristics.
|
7
7
|
# Nodes will be composed by NodeGroup.compose method, according with the configuration of values/value_generator
|
8
8
|
# of the group of node itself.
|
9
|
-
class NodeGroup
|
9
|
+
class NodeGroup
|
10
10
|
|
11
11
|
# A number identifying the group of nodes withing the cluster.
|
12
12
|
attr_reader :index
|
13
|
-
|
14
|
-
# The name of the group of nodes
|
13
|
+
|
14
|
+
# The name of the group of nodes
|
15
15
|
attr_reader :name
|
16
|
-
|
16
|
+
|
17
17
|
# The number of nodes/instances to be created in the group of nodes.
|
18
18
|
attr_reader :instances
|
19
|
-
|
20
|
-
# The vagrant base box to be used for creating vagrant machines implementing nodes in this group.
|
19
|
+
|
20
|
+
# The value/value generator to be used for assigning to each node in this group a vagrant base box to be used for creating vagrant machines implementing nodes in this group.
|
21
21
|
attr_accessor :box
|
22
|
-
|
23
|
-
# The value
|
22
|
+
|
23
|
+
# The value/value generator to be used for assigning to each node in this group a box name a.k.a. the name for the machine in VirtualBox/VMware console.
|
24
24
|
attr_accessor :boxname
|
25
|
-
|
26
|
-
# The value
|
25
|
+
|
26
|
+
# The value/value generator to be used for assigning to each node in this group a unique hostname
|
27
27
|
attr_accessor :hostname
|
28
|
-
|
29
|
-
# The value
|
28
|
+
|
29
|
+
# The value/value generator to be used for assigning to each node in this group a unique list of aliases a.k.a. alternative host names
|
30
30
|
attr_accessor :aliases
|
31
|
-
|
32
|
-
# The value
|
31
|
+
|
32
|
+
# The value/value generator to be used for assigning to each node in this groupa unique ip
|
33
33
|
attr_accessor :ip
|
34
|
-
|
35
|
-
# The value/value
|
34
|
+
|
35
|
+
# The value/value generator to be used for assigning to each node in this group cpus
|
36
36
|
attr_accessor :cpus
|
37
|
-
|
38
|
-
# The value/value
|
37
|
+
|
38
|
+
# The value/value generator to be used for assigning to each node in this group memory
|
39
39
|
attr_accessor :memory
|
40
|
-
|
41
|
-
# The value/value
|
40
|
+
|
41
|
+
# The value/value generator to be used for assigning each node in this group to a list of ansible groups
|
42
42
|
attr_accessor :ansible_groups
|
43
|
-
|
44
|
-
# The value/value
|
43
|
+
|
44
|
+
# The value/value generator to be used for assigning a dictionary with custom attributes - Hash(String, obj) - to each node in this group.
|
45
45
|
attr_accessor :attributes
|
46
46
|
|
47
|
-
def initialize(index, instances, name)
|
47
|
+
def initialize(index, instances, name)
|
48
48
|
@index = index
|
49
49
|
@name = name
|
50
50
|
@instances = instances
|
51
|
-
end
|
51
|
+
end
|
52
52
|
|
53
|
-
# Composes the group of nodes, by creating the
|
54
|
-
# in
|
55
|
-
# Additionally, some "embedded" trasformation will be applied to attributes (boxname, hostname) and
|
53
|
+
# Composes the group of nodes, by creating the required number of nodes
|
54
|
+
# in accordance with values/value_generators.
|
55
|
+
# Additionally, some "embedded" trasformation will be applied to attributes (boxname, hostname) and
|
56
56
|
# some "autogenerated" node properties will be computed (fqdn).
|
57
57
|
def compose(cluster_name, cluster_domain, cluster_offset)
|
58
58
|
node_index = 0
|
59
59
|
while node_index < @instances
|
60
|
-
box = generate(:box, @box, node_index)
|
60
|
+
box = generate(:box, @box, node_index)
|
61
61
|
boxname = maybe_prefix(cluster_name,
|
62
62
|
"#{generate(:boxname, @boxname, node_index)}")
|
63
63
|
hostname = maybe_prefix(cluster_name,
|
@@ -66,7 +66,7 @@ module VagrantPlugins
|
|
66
66
|
fqdn = cluster_domain.empty? ? "#{hostname}" : "#{hostname}.#{cluster_domain}"
|
67
67
|
ip = generate(:ip, @ip, node_index)
|
68
68
|
cpus = generate(:cpus, @cpus, node_index)
|
69
|
-
memory = generate(:memory, @memory, node_index)
|
69
|
+
memory = generate(:memory, @memory, node_index)
|
70
70
|
ansible_groups = generate(:ansible_groups, @ansible_groups, node_index)
|
71
71
|
attributes = generate(:attributes, @attributes, node_index)
|
72
72
|
yield Node.new(box, boxname, hostname, fqdn, aliases, ip, cpus, memory, ansible_groups, attributes, cluster_offset + node_index, node_index)
|
@@ -90,13 +90,13 @@ module VagrantPlugins
|
|
90
90
|
return generator
|
91
91
|
else
|
92
92
|
begin
|
93
|
-
return generator.call(@index, @name, node_index)
|
93
|
+
return generator.call(@index, @name, node_index)
|
94
94
|
rescue Exception => e
|
95
95
|
raise VagrantPlugins::Compose::Errors::AttributeExpressionError, :message => e.message, :attribute => var, :node_index => node_index, :node_group_name => name
|
96
96
|
end
|
97
97
|
end
|
98
98
|
end
|
99
|
-
end
|
100
|
-
|
99
|
+
end
|
100
|
+
|
101
101
|
end
|
102
|
-
end
|
102
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-compose
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fabrizio Pandini
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -75,6 +75,7 @@ files:
|
|
75
75
|
- lib/vagrant/compose/version.rb
|
76
76
|
- lib/vagrant/compose.rb
|
77
77
|
- LICENCE
|
78
|
+
- provisioning/group_vars/zookeeper.yml
|
78
79
|
- Rakefile
|
79
80
|
- README.md
|
80
81
|
- vagrant-compose.gemspec
|
@@ -101,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
102
|
version: 2.0.13
|
102
103
|
requirements: []
|
103
104
|
rubyforge_project:
|
104
|
-
rubygems_version: 2.0.14
|
105
|
+
rubygems_version: 2.0.14.1
|
105
106
|
signing_key:
|
106
107
|
specification_version: 4
|
107
108
|
summary: A Vagrant plugin that helps building complex multi-machine scenarios.
|