talos 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +177 -0
- data/config.ru +2 -2
- data/lib/talos.rb +65 -51
- data/spec/fixtures/hiera.yaml +3 -3
- data/spec/fixtures/master.3fa3fd97848a72ae539b75bccd6028cd1d4e92e3/role/foobar/testing.yaml +1 -0
- data/spec/fixtures/master.3fa3fd97848a72ae539b75bccd6028cd1d4e92e3/site/sjc.yaml +1 -0
- data/spec/fixtures/talos.yaml +10 -0
- data/spec/talos_spec.rb +18 -14
- data/talos.gemspec +3 -3
- metadata +12 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a963d1d621605ff8c6bbc9fcd5a66ec02f63509c
|
4
|
+
data.tar.gz: a16ebee4fbc780bf4911e6df1eeab33701f35e45
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32b2795e08276905aec04ee7918da2041a612424772df39c65fe86ae961bea50cc44a3a53ab76fba03e2eed92bb7cc8dc84962dd79a9c3d55374b87ef6e023b4
|
7
|
+
data.tar.gz: c77f95c6f9c96a8cc25ba202548dda2be9d0495407106a307f380ce5edf484b1feb141dbb294981023011c4dcd447edabdf196df100baff91d8783f4bdf56303
|
data/README.md
ADDED
@@ -0,0 +1,177 @@
|
|
1
|
+
Talos
|
2
|
+
=====
|
3
|
+
|
4
|
+
[![Gem Version](https://badge.fury.io/rb/talos.svg)](http://badge.fury.io/rb/talos)
|
5
|
+
[![Build Status](https://travis-ci.org/spotify/talos.png?branch=master)](https://travis-ci.org/spotify/talos)
|
6
|
+
|
7
|
+
Talos is a rack application which servers Hiera yaml files over HTTP.
|
8
|
+
It authorizes clients based on the SSL certificates issued by the Puppet CA and returns only the files in the Hiera scope.
|
9
|
+
|
10
|
+
Talos is used to store and distribute secrets via Hiera to the masterless puppet clients.
|
11
|
+
|
12
|
+
How it works
|
13
|
+
------------
|
14
|
+
Talos listens for incoming HTTP requests and returns compressed hiera
|
15
|
+
tree based on the client's SSL certificate.
|
16
|
+
|
17
|
+
To determine the list of files to send, Talos matches the certificate
|
18
|
+
common name against a list of regular expressions.
|
19
|
+
|
20
|
+
Fetching the tree
|
21
|
+
-----------------
|
22
|
+
|
23
|
+
It's possible to run a cron task or create a wrapper around the puppet
|
24
|
+
agent. Here's an example of the client-side code which uses local puppet SSL key
|
25
|
+
to authenticate:
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
require 'puppet'
|
29
|
+
Puppet[:confdir] = '/etc/puppetlabs/puppet/'
|
30
|
+
`/usr/bin/curl -s --fail -X GET -k https://talos.internal}/ \
|
31
|
+
--cert #{Puppet[:hostcert]} --key #{Puppet[:hostprivkey]} \
|
32
|
+
--data-urlencode pool=#{Facter.value(:pool)} > /etc/talos/tree.tar.gz`
|
33
|
+
`/bin/tar xzf /etc/talos/tree.tar.gz -C /etc/talos/hiera_secrets`
|
34
|
+
```
|
35
|
+
|
36
|
+
In this example the client also passes `pool` variable which will
|
37
|
+
be included in the Hiera scope if `unsafe_scopes` option is enabled.
|
38
|
+
|
39
|
+
The received copy of the tree could be included in the local hiera config
|
40
|
+
and used in the normal puppet runs.
|
41
|
+
|
42
|
+
Configuration
|
43
|
+
-------------
|
44
|
+
Talos configuration is stored in `/etc/talos/talos.yaml`:
|
45
|
+
|
46
|
+
```yaml
|
47
|
+
scopes:
|
48
|
+
# lon-puppet-a1: site = lon, role = puppet, pool = a
|
49
|
+
- match: '(?<site>[[:alpha:]]+)-(?<role>[a-z0-9]+)-(?<pool>[[:alpha:]]+)'
|
50
|
+
facts:
|
51
|
+
environment: production
|
52
|
+
- match: 'cloud\.example\.com'
|
53
|
+
facts:
|
54
|
+
environment: testing
|
55
|
+
|
56
|
+
unsafe_scopes: true
|
57
|
+
```
|
58
|
+
|
59
|
+
When receiving a request, Talos iterates over `scopes` list and matches
|
60
|
+
the client certificate against the `match` blocks. If the match is
|
61
|
+
successful, Talos does 2 things:
|
62
|
+
|
63
|
+
1. Adds all the named captures from the regexp to the Hiera scope
|
64
|
+
2. Adds all the `facts` to the Hiera scope
|
65
|
+
|
66
|
+
Talos will iterate over all the regexps updating the
|
67
|
+
Hiera scope, meaning that the later matches will override the existing
|
68
|
+
scope on collision.
|
69
|
+
|
70
|
+
If `unsafe_scopes` option is enabled, Talos will also add all the parameters
|
71
|
+
passed by the client to the Hiera scope.
|
72
|
+
|
73
|
+
Hiera
|
74
|
+
-----
|
75
|
+
You need to provide `/etc/talos/hiera.yaml` file to configure Hiera
|
76
|
+
backend on the Talos server:
|
77
|
+
|
78
|
+
```yaml
|
79
|
+
---
|
80
|
+
:backends:
|
81
|
+
- yaml
|
82
|
+
:hierarchy:
|
83
|
+
- 'hiera-secrets/fqdn/%{fqdn}'
|
84
|
+
- 'hiera-secrets/role/%{role}/%{pod}/%{pool}'
|
85
|
+
- 'hiera-secrets/role/%{role}/%{pod}'
|
86
|
+
- 'hiera-secrets/role/%{role}'
|
87
|
+
- 'hiera-secrets/pod/%{pod}'
|
88
|
+
- 'hiera-secrets/common'
|
89
|
+
:yaml:
|
90
|
+
:datadir: '/etc/puppet'
|
91
|
+
:merge_behavior: :deeper
|
92
|
+
```
|
93
|
+
|
94
|
+
Talos will use the `datadir` option to search for YAML files and it
|
95
|
+
will return only the files that match the Hiera scope of the clients.
|
96
|
+
|
97
|
+
|
98
|
+
Installing
|
99
|
+
----------
|
100
|
+
|
101
|
+
First, install talos using rubygems:
|
102
|
+
|
103
|
+
$ gem install talos
|
104
|
+
|
105
|
+
Create a separate user and Document Root for the Rack application:
|
106
|
+
|
107
|
+
$ useradd talos --system --create-home --home-dir /var/lib/talos
|
108
|
+
$ mkdir -p /var/lib/talos/public /var/lib/talos/tmp /etc/talos
|
109
|
+
$ chown -R talos:talos /var/lib/talos/ /etc/talos
|
110
|
+
|
111
|
+
Then copy [config.ru](config.ru) to `/var/lib/talos/` directory.
|
112
|
+
|
113
|
+
You also need to copy and adjust [hiera.yaml](spec/fixtures/hiera.yaml) and
|
114
|
+
[talos.yaml](spec/fixtures/talos.yaml) configs in `/etc/talos` directory.
|
115
|
+
|
116
|
+
### Hiera repository
|
117
|
+
|
118
|
+
You need to have a copy of the hiera-secrets repository available on the
|
119
|
+
talos server. Make sure it's located at the `datadir` specified in
|
120
|
+
`/etc/talos/hiera.yaml`
|
121
|
+
|
122
|
+
### Apache
|
123
|
+
|
124
|
+
You can run Talos using Passenger or any other application server. Make
|
125
|
+
sure you use Puppet SSL keys to validate the client certificates and to
|
126
|
+
forward `SSL_CLIENT_S_DN_CN` header:
|
127
|
+
|
128
|
+
```
|
129
|
+
<VirtualHost *:443>
|
130
|
+
DocumentRoot "/var/lib/talos/public"
|
131
|
+
|
132
|
+
<Directory "/var/lib/talos/public">
|
133
|
+
Require all granted
|
134
|
+
</Directory>
|
135
|
+
|
136
|
+
SSLEngine on
|
137
|
+
SSLCertificateFile "/etc/puppetlabs/puppet/ssl/certs/talos.internal.pem"
|
138
|
+
SSLCertificateKeyFile "/etc/puppetlabs/puppet/ssl/private_keys/talos.internal.pem"
|
139
|
+
SSLCertificateChainFile "/etc/puppetlabs/puppet/ssl/certs/ca.pem"
|
140
|
+
SSLCACertificatePath "/etc/ssl/certs"
|
141
|
+
SSLCACertificateFile "/etc/puppetlabs/puppet/ssl/certs/ca.pem"
|
142
|
+
SSLCARevocationFile "/etc/puppetlabs/puppet/ssl/crl.pem"
|
143
|
+
SSLVerifyClient require
|
144
|
+
SSLOptions +StdEnvVars +FakeBasicAuth
|
145
|
+
RequestHeader set SSL_CLIENT_S_DN_CN "%{SSL_CLIENT_S_DN_CN}s"
|
146
|
+
</VirtualHost>
|
147
|
+
```
|
148
|
+
|
149
|
+
Contributing
|
150
|
+
------------
|
151
|
+
1. Fork the project on github
|
152
|
+
2. Create your feature branch
|
153
|
+
3. Open a Pull Request
|
154
|
+
|
155
|
+
This project adheres to the [Open Code of Conduct][code-of-conduct]. By
|
156
|
+
participating, you are expected to honor this code.
|
157
|
+
|
158
|
+
[code-of-conduct]:
|
159
|
+
https://github.com/spotify/code-of-conduct/blob/master/code-of-conduct.md
|
160
|
+
|
161
|
+
License
|
162
|
+
-----------------
|
163
|
+
```text
|
164
|
+
Copyright 2013-2016 Spotify AB
|
165
|
+
|
166
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
167
|
+
you may not use this file except in compliance with the License.
|
168
|
+
You may obtain a copy of the License at
|
169
|
+
|
170
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
171
|
+
|
172
|
+
Unless required by applicable law or agreed to in writing, software
|
173
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
174
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
175
|
+
See the License for the specific language governing permissions and
|
176
|
+
limitations under the License.
|
177
|
+
```
|
data/config.ru
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
# uncomment if you wish to run from source code
|
3
|
-
libdir = File.join(File.dirname(__FILE__), 'lib')
|
4
|
-
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
|
3
|
+
# libdir = File.join(File.dirname(__FILE__), 'lib')
|
4
|
+
# $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
|
5
5
|
require 'talos'
|
6
6
|
run Talos
|
data/lib/talos.rb
CHANGED
@@ -1,4 +1,20 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
#--
|
3
|
+
# Copyright 2015 Spotify AB
|
4
|
+
#
|
5
|
+
# The contents of this file are licensed under the Apache License, Version 2.0
|
6
|
+
# (the "License"); you may not use this file except in compliance with the
|
7
|
+
# License. You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
13
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
14
|
+
# License for the specific language governing permissions and limitations under
|
15
|
+
# the License.
|
16
|
+
#++
|
17
|
+
|
2
18
|
require 'sinatra/base'
|
3
19
|
require 'json'
|
4
20
|
require 'hiera'
|
@@ -8,91 +24,89 @@ require 'archive/tar/minitar'
|
|
8
24
|
require 'pathname'
|
9
25
|
include Archive::Tar
|
10
26
|
|
11
|
-
def get_scope(fqdn, role = nil, pod = nil, pool = nil)
|
12
|
-
# FQDN from ssl
|
13
|
-
# role FQDN or client if unavailable
|
14
|
-
# pod - FQDN or client
|
15
|
-
# site - from pod
|
16
|
-
# spenvironment - FQDN
|
17
|
-
# pool - hostname or default to a
|
18
|
-
scope = { 'fqdn' => fqdn }
|
19
|
-
result = /(([[:alpha:]]+)\d*)-([a-z0-9]+)-([[:alpha:]])+/.match(fqdn)
|
20
|
-
|
21
|
-
if !result.nil?
|
22
|
-
scope['pod'] = result.captures[0]
|
23
|
-
scope['site'] = result.captures[1]
|
24
|
-
scope['role'] = result.captures[2]
|
25
|
-
scope['pool'] = result.captures[3]
|
26
|
-
scope['site'] = scope['pod'].tr('[0-9]', '')
|
27
|
-
else
|
28
|
-
# FQDN is not following our naming standard
|
29
|
-
scope['pod'] = pod
|
30
|
-
scope['role'] = role
|
31
|
-
scope['pool'] = pool
|
32
|
-
scope['site'] = scope['pod'].tr('[0-9]', '') unless pod.nil?
|
33
|
-
end
|
34
|
-
|
35
|
-
scope
|
36
|
-
end
|
37
|
-
|
38
|
-
|
39
27
|
class Talos < Sinatra::Base
|
40
|
-
def
|
41
|
-
|
42
|
-
|
28
|
+
def self.prepare_config(path)
|
29
|
+
set :talos, YAML.load_file(path)
|
30
|
+
settings.talos['scopes'].each do |scope_config|
|
31
|
+
begin
|
32
|
+
scope_config['regexp'] = Regexp.new(scope_config['match'])
|
33
|
+
rescue
|
34
|
+
fail "Invalid regexp: #{scope_config['match']}"
|
35
|
+
end
|
36
|
+
end
|
43
37
|
end
|
44
38
|
|
45
39
|
configure :development do
|
46
40
|
require 'sinatra/reloader'
|
47
41
|
register Sinatra::Reloader
|
48
42
|
set :hiera, Hiera::Config::load(File.expand_path('spec/fixtures/hiera.yaml'))
|
43
|
+
prepare_config('spec/fixtures/talos.yaml')
|
49
44
|
set :show_exceptions, false
|
50
45
|
end
|
46
|
+
|
51
47
|
configure :production do
|
52
48
|
set :hiera, Hiera::Config::load(File.expand_path('/etc/talos/hiera.yaml'))
|
49
|
+
prepare_config('/etc/talos/talos.yaml')
|
50
|
+
warn("SECURITY WARNING: unsafe_scopes are enabled, SSL authentication bypass is possible") if settings.talos['unsafe_scopes']
|
53
51
|
end
|
54
52
|
|
55
|
-
|
56
|
-
|
53
|
+
def absolute_datadir
|
54
|
+
datadir = settings.hiera[:yaml][:datadir]
|
55
|
+
datadir = File.join(File.dirname(__FILE__), '..', datadir) if Pathname.new(datadir).relative?
|
56
|
+
end
|
57
57
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
58
|
+
# Extracts scopes from FQDN using regexp with named captures
|
59
|
+
# Falls back to insecure arguments passed by the puppet agent
|
60
|
+
# (needed for the hosts not following naming convention)
|
61
|
+
def get_scope(fqdn)
|
62
|
+
scope = {'fqdn' => fqdn}
|
63
|
+
settings.talos['scopes'].each do | scope_config|
|
64
|
+
if m = fqdn.match(scope_config['regexp'])
|
65
|
+
scope.update(Hash[ m.names.zip( m.captures ) ])
|
66
|
+
scope.update(scope_config['facts'])
|
67
|
+
end
|
67
68
|
end
|
68
69
|
|
69
|
-
|
70
|
-
|
70
|
+
unsafe_scope = settings.talos['unsafe_scopes'] ? request.env['rack.request.query_hash'] : {}
|
71
|
+
scope.update(unsafe_scope)
|
72
|
+
# scope = {"pod"=>"lon3", "site"=>"lon", "role"=>"puppet", "pool"=>"a"}
|
73
|
+
scope
|
74
|
+
end
|
71
75
|
|
72
|
-
|
76
|
+
def files_in_scope(scope)
|
77
|
+
files = []
|
73
78
|
Hiera::Backend.datasources(scope, nil) do |source, yamlfile|
|
74
79
|
yamlfile = Hiera::Backend.datafile(:yaml, scope, source, 'yaml') || next
|
75
80
|
next unless File.exist?(yamlfile)
|
76
81
|
# Strip path from filename
|
77
|
-
|
82
|
+
files << yamlfile.gsub(settings.hiera[:yaml][:datadir] + '/', '')
|
78
83
|
end
|
84
|
+
files
|
85
|
+
end
|
79
86
|
|
87
|
+
def compress_files(files)
|
80
88
|
output = StringIO.new
|
81
89
|
begin
|
82
90
|
sgz = Zlib::GzipWriter.new(output)
|
83
91
|
tar = Minitar::Output.new(sgz)
|
84
|
-
|
85
|
-
Dir.chdir(absolute_datadir) do
|
86
|
-
files_to_pack.each { |f| Minitar.pack_file(f, tar) }
|
87
|
-
end
|
92
|
+
Dir.chdir(absolute_datadir) { files.each { |f| Minitar.pack_file(f, tar) } }
|
88
93
|
ensure
|
89
94
|
tar.close
|
90
95
|
end
|
96
|
+
output
|
97
|
+
end
|
98
|
+
|
99
|
+
get '/' do
|
100
|
+
fqdn = settings.development? ? params[:fqdn] : request.env['HTTP_SSL_CLIENT_S_DN_CN']
|
101
|
+
scope = get_scope(fqdn)
|
102
|
+
files_to_pack = files_in_scope(scope)
|
103
|
+
archive = compress_files(files_to_pack)
|
91
104
|
content_type 'application/x-gzip'
|
92
|
-
|
105
|
+
archive.string
|
93
106
|
end
|
94
107
|
|
95
108
|
# Get the checksum the data folder symlink to
|
109
|
+
# Internal API
|
96
110
|
get '/status' do
|
97
111
|
begin
|
98
112
|
File.readlink(absolute_datadir).split('.').last
|
data/spec/fixtures/hiera.yaml
CHANGED
@@ -4,15 +4,15 @@
|
|
4
4
|
|
5
5
|
:hierarchy:
|
6
6
|
- 'fqdn/%{fqdn}'
|
7
|
-
- 'role/%{role}/%{
|
7
|
+
- 'role/%{role}/%{environment}/%{pool}'
|
8
8
|
- 'role/%{role}/%{pool}'
|
9
|
-
- 'role/%{role}/%{
|
9
|
+
- 'role/%{role}/%{environment}'
|
10
10
|
- 'role/%{role}'
|
11
11
|
- 'lsbdistcodename/%{lsbdistcodename}'
|
12
12
|
- 'domain/%{domain}'
|
13
13
|
- 'pod/%{pod}'
|
14
14
|
- 'site/%{site}'
|
15
|
-
- '
|
15
|
+
- 'environment/%{environment}'
|
16
16
|
- common
|
17
17
|
|
18
18
|
:yaml:
|
@@ -0,0 +1 @@
|
|
1
|
+
foo::bar: baz
|
@@ -0,0 +1 @@
|
|
1
|
+
foo::bar: baz
|
@@ -0,0 +1,10 @@
|
|
1
|
+
unsafe_scopes: true
|
2
|
+
|
3
|
+
scopes:
|
4
|
+
# lon3-puppet-a1: pod = lon3, site = lon3, role = puppet, pool = a
|
5
|
+
- match: '(?<pod>(?<site>[[:alpha:]]+)\d*)-(?<role>[a-z0-9]+)-(?<pool>[[:alpha:]]+)\d+'
|
6
|
+
facts:
|
7
|
+
environment: production
|
8
|
+
- match: 'cloud\.example\.com'
|
9
|
+
facts:
|
10
|
+
environment: testing
|
data/spec/talos_spec.rb
CHANGED
@@ -5,26 +5,30 @@ describe 'talos' do
|
|
5
5
|
|
6
6
|
def match_query_to_files(query, files)
|
7
7
|
get query
|
8
|
-
last_response.
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
8
|
+
expect(last_response).to be_ok
|
9
|
+
Tempfile.open('spec') do |file|
|
10
|
+
file.write(last_response.body)
|
11
|
+
file.flush
|
12
|
+
files_in_archive = `tar -tf #{file.path}`.split
|
13
|
+
files.each { |f| expect(files.sort).to eq(files_in_archive.sort) }
|
14
|
+
end
|
15
15
|
end
|
16
16
|
|
17
|
-
it 'should return
|
17
|
+
it 'should detect scope and return YAML files' do
|
18
18
|
{ '/?fqdn=testing.int.sto.example.com' =>
|
19
|
-
|
19
|
+
%w(common.yaml),
|
20
20
|
'/?role=puppet&pod=sto3&fqdn=sto3-puppet-a1.sto3.example.com' =>
|
21
|
-
|
21
|
+
%w(common.yaml role/puppet.yaml),
|
22
22
|
'/?fqdn=sto3-puppet-a1.sto3.example.com' =>
|
23
|
-
|
23
|
+
%w(common.yaml role/puppet.yaml),
|
24
24
|
'/?role=puppet&pod=sto3&fqdn=foo.bar' =>
|
25
25
|
%w(common.yaml role/puppet.yaml fqdn/foo.bar.yaml),
|
26
26
|
'/?fqdn=something.random&role=foobar&pool=z' =>
|
27
|
-
%w(common.yaml role/foobar/z.yaml)
|
27
|
+
%w(common.yaml role/foobar/z.yaml),
|
28
|
+
'/?fqdn=sjc1-puppet-a1' =>
|
29
|
+
%w(common.yaml role/puppet.yaml site/sjc.yaml),
|
30
|
+
'/?fqdn=sjc1-foobar-a1.cloud.example.com' =>
|
31
|
+
%w(common.yaml site/sjc.yaml role/foobar/testing.yaml),
|
28
32
|
}.each do |query, files|
|
29
33
|
match_query_to_files(query, files)
|
30
34
|
end
|
@@ -32,7 +36,7 @@ describe 'talos' do
|
|
32
36
|
|
33
37
|
it 'should resturn the checksum master symlink to' do
|
34
38
|
get '/status'
|
35
|
-
last_response.
|
36
|
-
last_response.body.
|
39
|
+
expect(last_response).to be_ok
|
40
|
+
expect(last_response.body).to match('3fa3fd97848a72ae539b75bccd6028cd1d4e92e3')
|
37
41
|
end
|
38
42
|
end
|
data/talos.gemspec
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
|
-
s.version = '0.1.
|
2
|
+
s.version = '0.1.1'
|
3
3
|
s.name = 'talos'
|
4
4
|
s.authors = ['Alexey Lapitsky', 'Johan Haals']
|
5
5
|
s.email = 'alexey@spotify.com'
|
6
|
-
s.summary
|
7
|
-
s.description
|
6
|
+
s.summary = %q{Hiera secrets distribution over HTTP}
|
7
|
+
s.description = %q{Distribute compressed hiera yaml files to authenticated puppet clients over HTTP}
|
8
8
|
s.homepage = 'https://github.com/spotify/talos'
|
9
9
|
s.license = 'Apache 2.0'
|
10
10
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: talos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexey Lapitsky
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2016-01-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
@@ -109,7 +109,8 @@ dependencies:
|
|
109
109
|
- - '>='
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '2.9'
|
112
|
-
description:
|
112
|
+
description: Distribute compressed hiera yaml files to authenticated puppet clients
|
113
|
+
over HTTP
|
113
114
|
email: alexey@spotify.com
|
114
115
|
executables: []
|
115
116
|
extensions: []
|
@@ -119,14 +120,18 @@ files:
|
|
119
120
|
- .rspec
|
120
121
|
- Gemfile
|
121
122
|
- LICENSE
|
123
|
+
- README.md
|
122
124
|
- Rakefile
|
123
125
|
- config.ru
|
124
126
|
- lib/talos.rb
|
125
127
|
- spec/fixtures/hiera.yaml
|
126
128
|
- spec/fixtures/master.3fa3fd97848a72ae539b75bccd6028cd1d4e92e3/common.yaml
|
127
129
|
- spec/fixtures/master.3fa3fd97848a72ae539b75bccd6028cd1d4e92e3/fqdn/foo.bar.yaml
|
130
|
+
- spec/fixtures/master.3fa3fd97848a72ae539b75bccd6028cd1d4e92e3/role/foobar/testing.yaml
|
128
131
|
- spec/fixtures/master.3fa3fd97848a72ae539b75bccd6028cd1d4e92e3/role/foobar/z.yaml
|
129
132
|
- spec/fixtures/master.3fa3fd97848a72ae539b75bccd6028cd1d4e92e3/role/puppet.yaml
|
133
|
+
- spec/fixtures/master.3fa3fd97848a72ae539b75bccd6028cd1d4e92e3/site/sjc.yaml
|
134
|
+
- spec/fixtures/talos.yaml
|
130
135
|
- spec/spec_helper.rb
|
131
136
|
- spec/talos_spec.rb
|
132
137
|
- talos.gemspec
|
@@ -153,12 +158,15 @@ rubyforge_project:
|
|
153
158
|
rubygems_version: 2.0.14
|
154
159
|
signing_key:
|
155
160
|
specification_version: 4
|
156
|
-
summary:
|
161
|
+
summary: Hiera secrets distribution over HTTP
|
157
162
|
test_files:
|
158
163
|
- spec/fixtures/hiera.yaml
|
159
164
|
- spec/fixtures/master.3fa3fd97848a72ae539b75bccd6028cd1d4e92e3/common.yaml
|
160
165
|
- spec/fixtures/master.3fa3fd97848a72ae539b75bccd6028cd1d4e92e3/fqdn/foo.bar.yaml
|
166
|
+
- spec/fixtures/master.3fa3fd97848a72ae539b75bccd6028cd1d4e92e3/role/foobar/testing.yaml
|
161
167
|
- spec/fixtures/master.3fa3fd97848a72ae539b75bccd6028cd1d4e92e3/role/foobar/z.yaml
|
162
168
|
- spec/fixtures/master.3fa3fd97848a72ae539b75bccd6028cd1d4e92e3/role/puppet.yaml
|
169
|
+
- spec/fixtures/master.3fa3fd97848a72ae539b75bccd6028cd1d4e92e3/site/sjc.yaml
|
170
|
+
- spec/fixtures/talos.yaml
|
163
171
|
- spec/spec_helper.rb
|
164
172
|
- spec/talos_spec.rb
|