erb-hiera 0.4.4 → 0.5.0.pre.rc0
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 +5 -5
- data/README.md +21 -6
- data/example/hiera/environment/default.yaml +1 -0
- data/example/hiera/environment/prod.yaml +1 -0
- data/example/output/prod/template.txt +2 -0
- data/lib/erb-hiera/cli.rb +16 -8
- data/lib/erb-hiera/hiera.rb +24 -25
- data/lib/erb-hiera/version.rb +1 -1
- data/lib/erb-hiera.rb +26 -12
- data/lib/hiera/backend/hash_backend.rb +52 -0
- metadata +10 -6
- /data/example/{config.yaml → mapping.yaml} +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 2ca8894f2efe1edb0039fbacff8c3295e8105e89
|
|
4
|
+
data.tar.gz: a0003dd9922d0c13660882553231e09810592b6d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7475d8b195b11559609c2f9e665459516bc7b458dc2de6015ea22d4fc4c475669fc94efc8c83c64c19a2ef1d2be4c843afd5c5242e72372faf66854c7744349c
|
|
7
|
+
data.tar.gz: ff648a3b56a1437e65654ca456ad8982f974d65fefb0831545eff259f7354ed7054c2ab4dcae056e4d26fec556edc52ea87e5177a0b4a45dc74830507818e256
|
data/README.md
CHANGED
|
@@ -15,18 +15,33 @@ gem install erb-hiera
|
|
|
15
15
|
```
|
|
16
16
|
$ ./bin/erb-hiera --help
|
|
17
17
|
Options:
|
|
18
|
-
--config=<s>
|
|
19
|
-
--hiera-config=<s>
|
|
20
|
-
|
|
21
|
-
--
|
|
22
|
-
--
|
|
18
|
+
-m, --mapping-config=<s> specify mapping config file
|
|
19
|
+
-c, --hiera-config=<s> specify hiera config file
|
|
20
|
+
|
|
21
|
+
-i, --input=<s> override input config options
|
|
22
|
+
-o, --output=<s> override output config options
|
|
23
|
+
|
|
24
|
+
-s, --scope=<s> override the lookup scope
|
|
25
|
+
-v, --variables=<s> override facts
|
|
26
|
+
|
|
27
|
+
--dry-run don't write out files
|
|
28
|
+
|
|
29
|
+
--verbose print compiled templates
|
|
30
|
+
--debug enable hiera logging and print backtrace on error
|
|
31
|
+
|
|
23
32
|
```
|
|
24
33
|
|
|
25
34
|
## Example
|
|
26
35
|
|
|
27
36
|
```
|
|
28
37
|
cd example
|
|
29
|
-
erb-hiera --config
|
|
38
|
+
erb-hiera --mapping-config mapping.yaml --hiera-config hiera.yaml --verbose
|
|
39
|
+
|
|
40
|
+
# render a specific template using injected erb scope (outputs only to stdout)
|
|
41
|
+
erb-hiera --mapping-config mapping.yaml --hiera-config hiera.yaml --scope '{ "environment": "prod" }' -o -
|
|
42
|
+
|
|
43
|
+
# use normal lookup path but override a fact at the top level
|
|
44
|
+
erb-hiera --mapping-config mapping.yaml --hiera-config hiera.yaml --variables '{ "environment::description": "override description" }' -o -
|
|
30
45
|
```
|
|
31
46
|
|
|
32
47
|
## References
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
environment::description: "this is the default environment"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
environment::description: "this is the prod environment"
|
data/lib/erb-hiera/cli.rb
CHANGED
|
@@ -4,11 +4,19 @@ module ErbHiera
|
|
|
4
4
|
module CLI
|
|
5
5
|
def self.parse
|
|
6
6
|
option_parser = Trollop::Parser.new do
|
|
7
|
-
opt :
|
|
8
|
-
opt :hiera_config,
|
|
9
|
-
|
|
10
|
-
opt :
|
|
11
|
-
opt :
|
|
7
|
+
opt :mapping_config, "specify mapping config file", :type => :string, :short => :m
|
|
8
|
+
opt :hiera_config, "specify hiera config file\n ", :type => :string, :short => :c
|
|
9
|
+
|
|
10
|
+
opt :input, "override input config options", :type => :string, :short => :i
|
|
11
|
+
opt :output, "override output config options\n ", :type => :string, :short => :o
|
|
12
|
+
|
|
13
|
+
opt :scope, "override the lookup scope", :type => :string, :short => :s
|
|
14
|
+
opt :variables, "override facts\n ", :type => :string, :short => :v
|
|
15
|
+
|
|
16
|
+
opt :dry_run, "don't write out files\n "
|
|
17
|
+
|
|
18
|
+
opt :verbose, "print compiled templates"
|
|
19
|
+
opt :debug, "enable hiera logging and print backtrace on error\n "
|
|
12
20
|
end
|
|
13
21
|
|
|
14
22
|
options = Trollop.with_standard_exception_handling(option_parser) do
|
|
@@ -18,9 +26,9 @@ module ErbHiera
|
|
|
18
26
|
option_parser.parse ARGV
|
|
19
27
|
end
|
|
20
28
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
29
|
+
if options[:config_given]
|
|
30
|
+
raise ArgumentError, "config file not readable" unless File.readable?(options[:config])
|
|
31
|
+
end
|
|
24
32
|
|
|
25
33
|
raise ArgumentError, "hiera config file not specified" unless options[:hiera_config_given]
|
|
26
34
|
raise ArgumentError, "hiera config file not readable" unless File.readable?(options[:hiera_config])
|
data/lib/erb-hiera/hiera.rb
CHANGED
|
@@ -2,38 +2,26 @@ require "hiera"
|
|
|
2
2
|
|
|
3
3
|
module ErbHiera
|
|
4
4
|
module Hiera
|
|
5
|
-
def self.
|
|
6
|
-
hiera
|
|
7
|
-
|
|
8
|
-
value = hiera.lookup(key, nil, ErbHiera.scope, nil, :priority)
|
|
5
|
+
def self.erb_hiera
|
|
6
|
+
@hiera ||= begin
|
|
7
|
+
hiera = ::Hiera.new(:config => ErbHiera.options[:hiera_config])
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
exit 1
|
|
13
|
-
end
|
|
9
|
+
# injecting the Hash backend ensures that the --variables flag will always work as expected
|
|
10
|
+
hiera.config[:backends].insert(0, "hash") unless hiera.config[:backends][0] == "hash"
|
|
14
11
|
|
|
15
|
-
|
|
16
|
-
value
|
|
17
|
-
end
|
|
12
|
+
::Hiera.logger = ErbHiera.options[:debug_given] ? "console" : "noop"
|
|
18
13
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
14
|
+
if ErbHiera.options[:debug_given]
|
|
15
|
+
puts "# hiera config"
|
|
16
|
+
puts hiera.config.to_yaml
|
|
17
|
+
end
|
|
23
18
|
|
|
24
|
-
|
|
25
|
-
puts "\nerror: cannot find value for key: #{key}"
|
|
26
|
-
exit 1
|
|
19
|
+
hiera
|
|
27
20
|
end
|
|
28
|
-
|
|
29
|
-
puts "# #{key}: #{value}" if ErbHiera.options[:verbose]
|
|
30
|
-
value
|
|
31
21
|
end
|
|
32
22
|
|
|
33
|
-
def self.
|
|
34
|
-
|
|
35
|
-
::Hiera.logger = "noop"
|
|
36
|
-
value = hiera.lookup(key, nil, ErbHiera.scope, nil, :hash)
|
|
23
|
+
def self.hiera(key, type: :priority)
|
|
24
|
+
value = erb_hiera.lookup(key, nil, ErbHiera.scope, nil, type)
|
|
37
25
|
|
|
38
26
|
unless value
|
|
39
27
|
puts "\nerror: cannot find value for key: #{key}"
|
|
@@ -44,6 +32,17 @@ module ErbHiera
|
|
|
44
32
|
value
|
|
45
33
|
end
|
|
46
34
|
|
|
35
|
+
def self.hiera_array(key)
|
|
36
|
+
hiera(key, type: :array)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def self.hiera_hash(key)
|
|
40
|
+
hiera(key, type: :hash)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
# bind calls from template to context of this module
|
|
47
46
|
def self.get_binding
|
|
48
47
|
binding
|
|
49
48
|
end
|
data/lib/erb-hiera/version.rb
CHANGED
data/lib/erb-hiera.rb
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require "erb"
|
|
4
4
|
require "yaml"
|
|
5
|
+
require "json"
|
|
5
6
|
require "fileutils"
|
|
6
7
|
|
|
7
8
|
require "erb-hiera/version"
|
|
@@ -10,6 +11,8 @@ require "erb-hiera/directory"
|
|
|
10
11
|
require "erb-hiera/hiera"
|
|
11
12
|
require "erb-hiera/manifest"
|
|
12
13
|
|
|
14
|
+
require "hiera/backend/hash_backend"
|
|
15
|
+
|
|
13
16
|
module ErbHiera
|
|
14
17
|
class << self
|
|
15
18
|
attr_accessor :options, :scope
|
|
@@ -17,17 +20,20 @@ module ErbHiera
|
|
|
17
20
|
|
|
18
21
|
def self.run
|
|
19
22
|
@options = CLI.parse
|
|
20
|
-
|
|
21
23
|
mappings.each do |mapping|
|
|
22
|
-
ErbHiera.scope = mapping["scope"]
|
|
23
|
-
input = mapping["dir"]["input"]
|
|
24
|
-
output = mapping["dir"]["output"]
|
|
24
|
+
ErbHiera.scope = scope_from_cli || mapping["scope"]
|
|
25
|
+
input = options[:input] || mapping["dir"]["input"]
|
|
26
|
+
output = options[:output] || mapping["dir"]["output"]
|
|
25
27
|
|
|
26
28
|
[:input, :output].each do |location|
|
|
27
|
-
|
|
29
|
+
unless binding.local_variable_get(location)
|
|
30
|
+
raise StandardError, "error: undefined #{dir.to_s.split('_')[0]}put"
|
|
31
|
+
end
|
|
28
32
|
end
|
|
29
33
|
|
|
30
|
-
|
|
34
|
+
output = STDOUT if output == "-"
|
|
35
|
+
|
|
36
|
+
# if input is a file then out_file should be a file too
|
|
31
37
|
if input =~ /.erb$/
|
|
32
38
|
generate(output, input)
|
|
33
39
|
next
|
|
@@ -41,22 +47,29 @@ module ErbHiera
|
|
|
41
47
|
end
|
|
42
48
|
rescue => error
|
|
43
49
|
handle_error(error)
|
|
44
|
-
exit 1
|
|
45
50
|
end
|
|
46
51
|
|
|
47
52
|
private
|
|
48
53
|
|
|
54
|
+
def self.scope_from_cli
|
|
55
|
+
JSON.load(options[:scope]) if options[:scope]
|
|
56
|
+
end
|
|
57
|
+
|
|
49
58
|
def self.generate(out_file, manifest)
|
|
50
59
|
Manifest.info(manifest, out_file) if options[:verbose]
|
|
51
|
-
|
|
52
60
|
erb = ERB.new(File.read(manifest), nil, "-").result(Hiera.get_binding)
|
|
53
61
|
|
|
54
62
|
puts erb if options[:verbose]
|
|
55
63
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
64
|
+
return if options[:dry_run]
|
|
65
|
+
|
|
66
|
+
if out_file == STDOUT
|
|
67
|
+
puts erb
|
|
68
|
+
return
|
|
59
69
|
end
|
|
70
|
+
|
|
71
|
+
FileUtils.mkdir_p File.dirname(out_file) unless Dir.exists?(File.dirname(out_file))
|
|
72
|
+
File.write(out_file, erb)
|
|
60
73
|
end
|
|
61
74
|
|
|
62
75
|
def self.handle_error(error)
|
|
@@ -67,10 +80,11 @@ module ErbHiera
|
|
|
67
80
|
|
|
68
81
|
puts
|
|
69
82
|
puts error
|
|
83
|
+
exit 1
|
|
70
84
|
end
|
|
71
85
|
|
|
72
86
|
def self.mappings
|
|
73
|
-
YAML.load_file(options[:
|
|
87
|
+
YAML.load_file(ErbHiera.options[:mapping_config])
|
|
74
88
|
end
|
|
75
89
|
|
|
76
90
|
def self.manifests(dir)
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
class Hiera
|
|
2
|
+
module Backend
|
|
3
|
+
class Hash_backend
|
|
4
|
+
def initialize(cache=nil)
|
|
5
|
+
Hiera.debug("Hiera Hash backend starting")
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def lookup(key, scope, order_override, resolution_type, context)
|
|
9
|
+
answer = nil
|
|
10
|
+
found = false
|
|
11
|
+
|
|
12
|
+
Hiera.debug("Looking up #{key} in Hash backend")
|
|
13
|
+
|
|
14
|
+
throw :no_such_key unless ErbHiera.options[:variables_given]
|
|
15
|
+
|
|
16
|
+
data = JSON.load(ErbHiera.options[:variables])
|
|
17
|
+
|
|
18
|
+
throw :no_such_key unless data.include?(key)
|
|
19
|
+
found = true
|
|
20
|
+
|
|
21
|
+
# Extra logging that we found the key. This can be outputted
|
|
22
|
+
# multiple times if the resolution type is array or hash but that
|
|
23
|
+
# should be expected as the logging will then tell the user ALL the
|
|
24
|
+
# places where the key is found.
|
|
25
|
+
Hiera.debug("Found #{key} in Hash backend")
|
|
26
|
+
|
|
27
|
+
# for array resolution we just append to the array whatever
|
|
28
|
+
# we find, we then goes onto the next file and keep adding to
|
|
29
|
+
# the array
|
|
30
|
+
#
|
|
31
|
+
# for priority searches we break after the first found data item
|
|
32
|
+
new_answer = Backend.parse_answer(data[key], scope, {}, context)
|
|
33
|
+
case resolution_type.is_a?(Hash) ? :hash : resolution_type
|
|
34
|
+
when :array
|
|
35
|
+
raise Exception, "Hiera type mismatch for key '#{key}': expected Array and got #{new_answer.class}" unless new_answer.kind_of? Array or new_answer.kind_of? String
|
|
36
|
+
answer ||= []
|
|
37
|
+
answer << new_answer
|
|
38
|
+
when :hash
|
|
39
|
+
raise Exception, "Hiera type mismatch for key '#{key}': expected Hash and got #{new_answer.class}" unless new_answer.kind_of? Hash
|
|
40
|
+
answer ||= {}
|
|
41
|
+
answer = Backend.merge_answer(new_answer, answer, resolution_type)
|
|
42
|
+
else
|
|
43
|
+
answer = new_answer
|
|
44
|
+
return answer
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
throw :no_such_key unless found
|
|
48
|
+
return answer
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: erb-hiera
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.0.pre.rc0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Rob Wilson
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2018-05-
|
|
11
|
+
date: 2018-05-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: hiera
|
|
@@ -103,12 +103,15 @@ extra_rdoc_files: []
|
|
|
103
103
|
files:
|
|
104
104
|
- README.md
|
|
105
105
|
- bin/erb-hiera
|
|
106
|
-
- example/config.yaml
|
|
107
106
|
- example/hiera.yaml
|
|
108
107
|
- example/hiera/common.yaml
|
|
108
|
+
- example/hiera/environment/default.yaml
|
|
109
109
|
- example/hiera/environment/dev.yaml
|
|
110
|
+
- example/hiera/environment/prod.yaml
|
|
110
111
|
- example/hiera/environment/stage.yaml
|
|
112
|
+
- example/mapping.yaml
|
|
111
113
|
- example/output/dev/template.txt
|
|
114
|
+
- example/output/prod/template.txt
|
|
112
115
|
- example/output/stage/template.txt
|
|
113
116
|
- example/templates/template.txt
|
|
114
117
|
- lib/erb-hiera.rb
|
|
@@ -117,6 +120,7 @@ files:
|
|
|
117
120
|
- lib/erb-hiera/hiera.rb
|
|
118
121
|
- lib/erb-hiera/manifest.rb
|
|
119
122
|
- lib/erb-hiera/version.rb
|
|
123
|
+
- lib/hiera/backend/hash_backend.rb
|
|
120
124
|
homepage: https://github.com/roobert/erb-hiera
|
|
121
125
|
licenses:
|
|
122
126
|
- MIT
|
|
@@ -132,12 +136,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
132
136
|
version: '0'
|
|
133
137
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
134
138
|
requirements:
|
|
135
|
-
- - "
|
|
139
|
+
- - ">"
|
|
136
140
|
- !ruby/object:Gem::Version
|
|
137
|
-
version:
|
|
141
|
+
version: 1.3.1
|
|
138
142
|
requirements: []
|
|
139
143
|
rubyforge_project:
|
|
140
|
-
rubygems_version: 2.
|
|
144
|
+
rubygems_version: 2.6.14
|
|
141
145
|
signing_key:
|
|
142
146
|
specification_version: 4
|
|
143
147
|
summary: ERB Hiera Document Generator
|
|
File without changes
|