consul-templaterb 1.26.3 → 1.27.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/.rubocop.yml +7 -7
- data/.travis.yml +5 -5
- data/CHANGELOG.md +7 -0
- data/README.md +1 -1
- data/TemplateAPI.md +9 -0
- data/bin/consul-templaterb +30 -0
- data/lib/consul/async/consul_endpoint.rb +19 -3
- data/lib/consul/async/consul_template.rb +12 -0
- data/lib/consul/async/json_endpoint.rb +15 -2
- data/lib/consul/async/vault_endpoint.rb +16 -2
- data/lib/consul/async/version.rb +1 -1
- data/samples/checks_in_warning_or_critical_state.yaml.erb +13 -0
- data/samples/display_timestamped_changes.txt.erb +17 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea2191ec559b6c2ccc871a6cac0083fd894200bd268421eb25b12361a8fc4373
|
4
|
+
data.tar.gz: db35acece2ea661ef35cefad9c1a94dd452e533458cff6cfa97f3114d5cc502f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf4a2b9e2ee7ba6d811b8d20202c2c0bc998afe5fcbd08c1325f573a38b422a5d94a21666efff14526d44071aa2faeb36e2157f72a097d36dad8309b30418aef
|
7
|
+
data.tar.gz: 28087756e716a4a6e2c8526b4920571118a3c6b2896ff2e302d52281fccfb277b5741b1a0c8b2be132ba7c405c6ea689767369b90c8db052562348739d3ba04d
|
data/.rubocop.yml
CHANGED
@@ -7,28 +7,28 @@ Layout/LineLength:
|
|
7
7
|
Max: 175
|
8
8
|
|
9
9
|
Metrics/AbcSize:
|
10
|
-
Max:
|
10
|
+
Max: 87
|
11
11
|
|
12
12
|
Metrics/BlockLength:
|
13
|
-
Max:
|
13
|
+
Max: 182
|
14
14
|
|
15
15
|
Metrics/BlockNesting:
|
16
16
|
Max: 4
|
17
17
|
|
18
18
|
Metrics/ClassLength:
|
19
|
-
Max:
|
19
|
+
Max: 285
|
20
20
|
|
21
21
|
Metrics/CyclomaticComplexity:
|
22
|
-
Max:
|
22
|
+
Max: 21
|
23
23
|
|
24
24
|
Metrics/MethodLength:
|
25
|
-
Max:
|
25
|
+
Max: 68
|
26
26
|
|
27
27
|
Metrics/ParameterLists:
|
28
|
-
Max:
|
28
|
+
Max: 18
|
29
29
|
|
30
30
|
Metrics/PerceivedComplexity:
|
31
|
-
Max:
|
31
|
+
Max: 24
|
32
32
|
|
33
33
|
# We use `dc` as a parameter in many methods
|
34
34
|
Naming/MethodParameterName:
|
data/.travis.yml
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
-
- 2.4.
|
4
|
-
- 2.5.
|
5
|
-
- 2.6.
|
6
|
-
- 2.7.
|
3
|
+
- 2.4.10
|
4
|
+
- 2.5.8
|
5
|
+
- 2.6.6
|
6
|
+
- 2.7.1
|
7
7
|
jobs:
|
8
8
|
include:
|
9
9
|
- stage: Gem release
|
10
|
-
rvm: 2.5.
|
10
|
+
rvm: 2.5.8
|
11
11
|
script: echo "Publishing consul-templaterb on rubygems.org ..."
|
12
12
|
deploy:
|
13
13
|
provider: rubygems
|
data/CHANGELOG.md
CHANGED
@@ -2,8 +2,15 @@
|
|
2
2
|
|
3
3
|
## (UNRELEASED)
|
4
4
|
|
5
|
+
## 1.27.0 (June 5, 2020)
|
6
|
+
|
5
7
|
NEW FEATURES:
|
6
8
|
|
9
|
+
* For Consul 1.7+, now support `checks_in_state(check_state, dc: nil, [agent: consul_agent_address])`,
|
10
|
+
fixes feature [#65](https://github.com/criteo/consul-templaterb/issues/65)
|
11
|
+
* New options to support/disable TLS validation thanks to [@jeromegn](https://github.com/jeromegn)
|
12
|
+
[#66](https://github.com/criteo/consul-templaterb/pull/66)
|
13
|
+
|
7
14
|
## 1.26.3 (April 15, 2020)
|
8
15
|
|
9
16
|
BUGFIX:
|
data/README.md
CHANGED
@@ -332,7 +332,7 @@ Please consult [CHANGELOG.md](CHANGELOG.md) for fixed bugs.
|
|
332
332
|
|
333
333
|
## TODO
|
334
334
|
|
335
|
-
* [x] Hashi's Vault support
|
335
|
+
* [x] Hashi's Vault support
|
336
336
|
* [ ] Implement automatic dynamic rate limit
|
337
337
|
* [x] More samples: apache, nginx, a full website displaying consul information...
|
338
338
|
* [x] Optimize rendering speed at start-up: an iteration is done every second by default, but it would be possible to speed
|
data/TemplateAPI.md
CHANGED
@@ -388,6 +388,15 @@ name or its ID. If DC is specified, will lookup for given node in another datace
|
|
388
388
|
|
389
389
|
[Find all the checks](https://www.consul.io/api/health.html#list-checks-for-service) of a given service.
|
390
390
|
|
391
|
+
## def checks_in_state(check_state, dc: nil, [agent: consul_agent_address])
|
392
|
+
|
393
|
+
[Find all the checks in a given state](https://www.consul.io/api-docs/health#list-checks-in-state) in the whole cluster.
|
394
|
+
|
395
|
+
The filter check_state must be one of any|critical|warning|passing.
|
396
|
+
|
397
|
+
Warning: this endpoint might be very frequently updated in a
|
398
|
+
large cluster if you are using `any` value. This endpoint is supported with Consul 1.7+.
|
399
|
+
|
391
400
|
## kv(name, [dc: nil], [keys: false], [recurse: false], [agent: consul_agent_address])
|
392
401
|
|
393
402
|
[Read keys from KV Store](https://www.consul.io/api/kv.html#read-key). It can be used for both listing the keys and
|
data/bin/consul-templaterb
CHANGED
@@ -28,6 +28,9 @@ options = {
|
|
28
28
|
},
|
29
29
|
base_url: ENV['VAULT_ADDR'] || 'http://localhost:8200',
|
30
30
|
token: ENV['VAULT_TOKEN'] || nil,
|
31
|
+
tls_cert_chain: ENV['VAULT_CLIENT_CERT'] || nil,
|
32
|
+
tls_private_key: ENV['VAULT_CLIENT_KEY'] || nil,
|
33
|
+
tls_verify_peer: true,
|
31
34
|
max_consecutive_errors_on_endpoint: 10, # Stop program after n consecutive failures on same endpoint
|
32
35
|
fail_fast_errors: nil, # fail fast the program if endpoint was never success
|
33
36
|
token_renew: true,
|
@@ -48,6 +51,9 @@ options = {
|
|
48
51
|
},
|
49
52
|
base_url: ENV['CONSUL_HTTP_ADDR'] || 'http://localhost:8500',
|
50
53
|
token: ENV['CONSUL_HTTP_TOKEN'] || nil,
|
54
|
+
tls_cert_chain: ENV['CONSUL_CLIENT_CERT'] || nil,
|
55
|
+
tls_private_key: ENV['CONSUL_CLIENT_KEY'] || nil,
|
56
|
+
tls_verify_peer: true,
|
51
57
|
max_consecutive_errors_on_endpoint: 10, # Stop program after n consecutive failures on same endpoint
|
52
58
|
fail_fast_errors: nil, # fail fast the program if endpoint was never success
|
53
59
|
retry_duration: 10, # On error, retry after n seconds
|
@@ -122,6 +128,18 @@ optparse = OptionParser.new do |opts|
|
|
122
128
|
options[:consul][:base_url] = consul_url
|
123
129
|
end
|
124
130
|
|
131
|
+
opts.on('--consul-cert-chain=<path/to/cert_chain>', String, 'Path to Consul TLS client certificate chain to use') do |consul_client_cert|
|
132
|
+
options[:consul][:tls_cert_chain] = consul_client_cert
|
133
|
+
end
|
134
|
+
|
135
|
+
opts.on('--consul-private-key=<path/to/private_key>', String, 'Path to Consul TLS client private key to use') do |consul_client_key|
|
136
|
+
options[:consul][:tls_private_key] = consul_client_key
|
137
|
+
end
|
138
|
+
|
139
|
+
opts.on('--skip-consul-verify-tls', 'Skip verifying Consul TLS via certificate authority (DANGEROUS)') do
|
140
|
+
options[:consul][:tls_verify_peer] = false
|
141
|
+
end
|
142
|
+
|
125
143
|
opts.on('-l', '--log-level=<log_level>', String, "Log level, default=info, any of #{::Consul::Async::Debug.levels.join('|')}") do |log_level|
|
126
144
|
::Consul::Async::Debug.level = log_level
|
127
145
|
end
|
@@ -134,6 +152,18 @@ optparse = OptionParser.new do |opts|
|
|
134
152
|
options[:vault][:base_url] = vault_url
|
135
153
|
end
|
136
154
|
|
155
|
+
opts.on('--vault-cert-chain=<path/to/cert_chain>', String, 'Path to Vault TLS client certificate chain to use') do |vault_client_cert|
|
156
|
+
options[:vault][:tls_cert_chain] = vault_client_cert
|
157
|
+
end
|
158
|
+
|
159
|
+
opts.on('--vault-private-key=<path/to/private_key>', String, 'Path to Vault TLS client private key to use') do |vault_client_key|
|
160
|
+
options[:vault][:tls_private_key] = vault_client_key
|
161
|
+
end
|
162
|
+
|
163
|
+
opts.on('--skip-vault-verify-tls', 'Skip verifying Vault TLS via certificate authority (DANGEROUS)') do
|
164
|
+
options[:vault][:tls_verify_peer] = false
|
165
|
+
end
|
166
|
+
|
137
167
|
opts.on('-T', '--vault-token=<token>', String, 'Token used to authenticate against vault.') do |vault_token|
|
138
168
|
options[:vault][:token] = vault_token
|
139
169
|
end
|
@@ -9,7 +9,7 @@ module Consul
|
|
9
9
|
class ConsulConfiguration
|
10
10
|
attr_reader :base_url, :token, :retry_duration, :min_duration, :wait_duration, :max_retry_duration, :retry_on_non_diff,
|
11
11
|
:missing_index_retry_time_on_diff, :missing_index_retry_time_on_unchanged, :debug, :enable_gzip_compression,
|
12
|
-
:fail_fast_errors, :max_consecutive_errors_on_endpoint
|
12
|
+
:fail_fast_errors, :max_consecutive_errors_on_endpoint, :tls_cert_chain, :tls_private_key, :tls_verify_peer
|
13
13
|
def initialize(base_url: 'http://localhost:8500',
|
14
14
|
debug: { network: false },
|
15
15
|
token: nil,
|
@@ -23,7 +23,10 @@ module Consul
|
|
23
23
|
enable_gzip_compression: true,
|
24
24
|
paths: {},
|
25
25
|
max_consecutive_errors_on_endpoint: 10,
|
26
|
-
fail_fast_errors: 1
|
26
|
+
fail_fast_errors: 1,
|
27
|
+
tls_cert_chain: nil,
|
28
|
+
tls_private_key: nil,
|
29
|
+
tls_verify_peer: true)
|
27
30
|
@base_url = base_url
|
28
31
|
@token = token
|
29
32
|
@debug = debug
|
@@ -38,6 +41,9 @@ module Consul
|
|
38
41
|
@paths = paths
|
39
42
|
@max_consecutive_errors_on_endpoint = max_consecutive_errors_on_endpoint
|
40
43
|
@fail_fast_errors = fail_fast_errors
|
44
|
+
@tls_cert_chain = tls_cert_chain
|
45
|
+
@tls_private_key = tls_private_key
|
46
|
+
@tls_verify_peer = tls_verify_peer
|
41
47
|
end
|
42
48
|
|
43
49
|
def ch(path, symbol)
|
@@ -71,7 +77,10 @@ module Consul
|
|
71
77
|
enable_gzip_compression: enable_gzip_compression,
|
72
78
|
paths: @paths,
|
73
79
|
max_consecutive_errors_on_endpoint: @max_consecutive_errors_on_endpoint,
|
74
|
-
fail_fast_errors: @fail_fast_errors
|
80
|
+
fail_fast_errors: @fail_fast_errors,
|
81
|
+
tls_cert_chain: ch(path, :tls_cert_chain),
|
82
|
+
tls_private_key: ch(path, :tls_private_key),
|
83
|
+
tls_verify_peer: ch(path, :tls_verify_peer))
|
75
84
|
end
|
76
85
|
end
|
77
86
|
|
@@ -233,6 +242,13 @@ module Consul
|
|
233
242
|
connect_timeout: 5, # default connection setup timeout
|
234
243
|
inactivity_timeout: conf.wait_duration + 1 + (conf.wait_duration / 16) # default connection inactivity (post-setup) timeout
|
235
244
|
}
|
245
|
+
unless conf.tls_cert_chain.nil?
|
246
|
+
options[:tls] = {
|
247
|
+
cert_chain_file: conf.tls_cert_chain,
|
248
|
+
private_key_file: conf.tls_private_key,
|
249
|
+
verify_peer: conf.tls_verify_peer
|
250
|
+
}
|
251
|
+
end
|
236
252
|
connection = {
|
237
253
|
conn: EventMachine::HttpRequest.new(conf.base_url, options)
|
238
254
|
}
|
@@ -161,6 +161,18 @@ module Consul
|
|
161
161
|
create_if_missing(path, query_params, agent: agent) { ConsulTemplateChecks.new(ConsulEndpoint.new(consul_conf, path, true, query_params, '[]', agent)) }
|
162
162
|
end
|
163
163
|
|
164
|
+
# https://www.consul.io/api-docs/health#list-checks-in-state
|
165
|
+
# Supported in Consul 1.7+
|
166
|
+
def checks_in_state(check_state, dc: nil, agent: nil)
|
167
|
+
valid_checks_states = %w[any critical passing warning]
|
168
|
+
raise "checks_in_state('#{check_state}'...) must be one of #{valid_checks_states}" unless valid_checks_states.include?(check_state)
|
169
|
+
|
170
|
+
path = "/v1/health/state/#{check_state}"
|
171
|
+
query_params = {}
|
172
|
+
query_params[:dc] = dc if dc
|
173
|
+
create_if_missing(path, query_params, agent: agent) { ConsulTemplateChecks.new(ConsulEndpoint.new(consul_conf, path, true, query_params, '[]', agent)) }
|
174
|
+
end
|
175
|
+
|
164
176
|
# https://www.consul.io/api/catalog.html#list-nodes
|
165
177
|
def nodes(dc: nil, agent: nil)
|
166
178
|
path = '/v1/catalog/nodes'
|
@@ -9,7 +9,7 @@ module Consul
|
|
9
9
|
class JSONConfiguration
|
10
10
|
attr_reader :url, :retry_duration, :min_duration, :retry_on_non_diff,
|
11
11
|
:debug, :enable_gzip_compression, :request_method, :json_body,
|
12
|
-
:headers
|
12
|
+
:headers, :tls_cert_chain, :tls_private_key, :tls_verify_peer
|
13
13
|
def initialize(url:,
|
14
14
|
debug: { network: false },
|
15
15
|
retry_duration: 10,
|
@@ -18,7 +18,10 @@ module Consul
|
|
18
18
|
request_method: :get,
|
19
19
|
json_body: nil,
|
20
20
|
headers: {},
|
21
|
-
enable_gzip_compression: true
|
21
|
+
enable_gzip_compression: true,
|
22
|
+
tls_cert_chain: nil,
|
23
|
+
tls_private_key: nil,
|
24
|
+
tls_verify_peer: true)
|
22
25
|
@url = url
|
23
26
|
@debug = debug
|
24
27
|
@enable_gzip_compression = enable_gzip_compression
|
@@ -28,6 +31,9 @@ module Consul
|
|
28
31
|
@request_method = request_method
|
29
32
|
@json_body = json_body
|
30
33
|
@headers = headers
|
34
|
+
@tls_cert_chain = tls_cert_chain
|
35
|
+
@tls_private_key = tls_private_key
|
36
|
+
@tls_verify_peer = tls_verify_peer
|
31
37
|
end
|
32
38
|
|
33
39
|
def create(_url)
|
@@ -181,6 +187,13 @@ module Consul
|
|
181
187
|
connect_timeout: 5, # default connection setup timeout
|
182
188
|
inactivity_timeout: 60 # default connection inactivity (post-setup) timeout
|
183
189
|
}
|
190
|
+
unless conf.tls_cert_chain.nil?
|
191
|
+
options[:tls] = {
|
192
|
+
cert_chain_file: conf.tls_cert_chain,
|
193
|
+
private_key_file: conf.tls_private_key,
|
194
|
+
verify_peer: conf.tls_verify_peer
|
195
|
+
}
|
196
|
+
end
|
184
197
|
connection = {
|
185
198
|
conn: EventMachine::HttpRequest.new(conf.url, options)
|
186
199
|
}
|
@@ -10,7 +10,8 @@ module Consul
|
|
10
10
|
# Configuration for Vault Endpoints
|
11
11
|
class VaultConfiguration
|
12
12
|
attr_reader :base_url, :token, :token_renew, :retry_duration, :min_duration, :wait_duration, :max_retry_duration, :retry_on_non_diff,
|
13
|
-
:lease_duration_factor, :debug, :max_consecutive_errors_on_endpoint, :fail_fast_errors
|
13
|
+
:lease_duration_factor, :debug, :max_consecutive_errors_on_endpoint, :fail_fast_errors, :tls_cert_chain, :tls_private_key,
|
14
|
+
:tls_verify_peer
|
14
15
|
|
15
16
|
def initialize(base_url: 'http://localhost:8200',
|
16
17
|
debug: { network: false },
|
@@ -22,7 +23,10 @@ module Consul
|
|
22
23
|
max_retry_duration: 600,
|
23
24
|
paths: {},
|
24
25
|
max_consecutive_errors_on_endpoint: 10,
|
25
|
-
fail_fast_errors: false
|
26
|
+
fail_fast_errors: false,
|
27
|
+
tls_cert_chain: nil,
|
28
|
+
tls_private_key: nil,
|
29
|
+
tls_verify_peer: true)
|
26
30
|
@base_url = base_url
|
27
31
|
@token_renew = token_renew
|
28
32
|
@debug = debug
|
@@ -34,6 +38,9 @@ module Consul
|
|
34
38
|
@token = token
|
35
39
|
@max_consecutive_errors_on_endpoint = max_consecutive_errors_on_endpoint
|
36
40
|
@fail_fast_errors = fail_fast_errors
|
41
|
+
@tls_cert_chain = tls_cert_chain
|
42
|
+
@tls_private_key = tls_private_key
|
43
|
+
@tls_verify_peer = tls_verify_peer
|
37
44
|
end
|
38
45
|
|
39
46
|
def ch(path, symbol)
|
@@ -226,6 +233,13 @@ module Consul
|
|
226
233
|
connect_timeout: 5, # default connection setup timeout
|
227
234
|
inactivity_timeout: 1 # default connection inactivity (post-setup) timeout
|
228
235
|
}
|
236
|
+
unless conf.tls_cert_chain.nil?
|
237
|
+
options[:tls] = {
|
238
|
+
cert_chain_file: conf.tls_cert_chain,
|
239
|
+
private_key_file: conf.tls_private_key,
|
240
|
+
verify_peer: conf.tls_verify_peer
|
241
|
+
}
|
242
|
+
end
|
229
243
|
connection = EventMachine::HttpRequest.new(conf.base_url, options)
|
230
244
|
cb = proc do |_|
|
231
245
|
http = connection.send(http_method.downcase, build_request) # Under the hood: c.send('get', {stuff}) === c.get({stuff})
|
data/lib/consul/async/version.rb
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
<%=
|
2
|
+
# This sample displays checks for the whole cluster
|
3
|
+
# in warning or critical state
|
4
|
+
# API available with Consul 1.7+
|
5
|
+
res = []
|
6
|
+
checks_in_state('warning').each do |c|
|
7
|
+
res << c
|
8
|
+
end
|
9
|
+
checks_in_state('critical').each do |c|
|
10
|
+
res << c
|
11
|
+
end
|
12
|
+
YAML.dump({'warning_or_critical_checks' => res})
|
13
|
+
%>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%
|
2
|
+
# This example show how to display local time informaition about changes
|
3
|
+
# Example of usage to display logs of changes on nodes() endpoint:
|
4
|
+
#
|
5
|
+
# consul-templaterb --template "display_timestamped_changes.txt.erb:display_timestamped_changes.txt:cat display_timestamped_changes.txt" -l error
|
6
|
+
#
|
7
|
+
# Would output:
|
8
|
+
# Last update: 1588800554 (2020-05-06 21:29:14 UTC), X-Consul-Index: 4345827328
|
9
|
+
# Last update: 1588800569 (2020-05-06 21:29:29 UTC), X-Consul-Index: 4345829548
|
10
|
+
# Last update: 1588800676 (2020-05-06 21:31:16 UTC), X-Consul-Index: 4345836342
|
11
|
+
#
|
12
|
+
@my_last_time = Time.now.utc unless @my_last_time
|
13
|
+
val = nodes()
|
14
|
+
new_idx = val.endpoint.x_consul_index
|
15
|
+
@my_last_time = Time.now.utc if @my_last_idx != new_idx
|
16
|
+
@my_last_idx = new_idx
|
17
|
+
%>Last update: <%= @my_last_time.to_i %> (<%= @my_last_time %>), X-Consul-Index: <%= new_idx %>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: consul-templaterb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.27.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SRE Core Services
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: em-http-request
|
@@ -198,6 +198,7 @@ files:
|
|
198
198
|
- samples/all_services.txt.erb
|
199
199
|
- samples/all_services_multi_agents.txt.erb
|
200
200
|
- samples/all_templates.erb
|
201
|
+
- samples/checks_in_warning_or_critical_state.yaml.erb
|
201
202
|
- samples/consul-ui/README.md
|
202
203
|
- samples/consul-ui/common/footer.html.erb
|
203
204
|
- samples/consul-ui/common/header.html.erb
|
@@ -229,6 +230,7 @@ files:
|
|
229
230
|
- samples/criteo/haproxy.cfg.erb
|
230
231
|
- samples/debug/compare_connect_services.txt.erb
|
231
232
|
- samples/demos/compute_pricing.txt.erb
|
233
|
+
- samples/display_timestamped_changes.txt.erb
|
232
234
|
- samples/find_all_invalid_dns_labels.json.erb
|
233
235
|
- samples/find_nodes_in_catalog_but_not_in_members.json.erb
|
234
236
|
- samples/ha_proxy.cfg.erb
|