Skip to content

Commit 8db0540

Browse files
committed
Create a LWRP to deploy ssh keys : ssh_keys_key
1 parent beb0ded commit 8db0540

File tree

6 files changed

+110
-150
lines changed

6 files changed

+110
-150
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Deploys SSH keys
1111

1212
| Key | Type | Default | Description |
1313
| :---------- |:---------- | :--------- | :---------------------------------------------------- |
14-
| `databag` | String | `ssh_keys` | Databag where to search for keys |
14+
| `data_bag` | String | `ssh_keys` | Databag where to search for keys |
1515
| `users` | Hash | `{}` | A list of users with names as key |
1616

1717
### Users

libraries/user.rb

+14-25
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,11 @@ module User
66
def self.valid?(username, user)
77
begin
88
Dir.home(username)
9+
10+
true
911
rescue
1012
raise Chef::Exceptions::ConfigurationError, "User #{user} does not exist"
1113
end
12-
13-
(
14-
(user.key?('authorized_keys') and not user['authorized_keys'].empty?) or
15-
(user.key?('authorized_users') and not user['authorized_users'].empty?)
16-
) or (
17-
(user.key?(:authorized_keys) and not user[:authorized_keys].empty?) or
18-
(user.key?(:authorized_users) and not user[:authorized_users].empty?)
19-
) or (
20-
not user.key?('authorized_keys') and
21-
not user.key?('authorized_users') and
22-
not user.key?(:authorized_keys) and
23-
not user.key?(:authorized_users)
24-
)
2514
end
2615

2716
def self.raise_if_invalid!(username, user)
@@ -30,27 +19,27 @@ def self.raise_if_invalid!(username, user)
3019
user
3120
end
3221

33-
def self.normalize!(username, user, node, data_bag_proc)
22+
def self.normalize!(username, user, data_bag_proc)
3423
normalized = raise_if_invalid!(username, user).dup
3524

36-
normalized['databag'] = data_bag_proc.call(node['ssh_keys']['databag'], username)
37-
normalized['databag'] ||= []
38-
normalized['home'] = Dir.home(username)
39-
normalized['authorized_keys'] ||= []
40-
normalized['authorized_users'] ||= []
41-
normalized['keys'] = []
25+
normalized[:databag] = data_bag_proc.call(username)
26+
normalized[:databag] ||= []
27+
normalized[:home] = Dir.home(username)
28+
normalized[:authorized_keys] ||= []
29+
normalized[:authorized_users] ||= []
30+
normalized[:keys] = []
4231

43-
normalized['databag']['keys'].each do |key|
44-
normalized['keys'] << PMSIpilot::SshKeys::Key.normalize!(key)
32+
normalized[:databag]['keys'].each do |key|
33+
normalized[:keys] << PMSIpilot::SshKeys::Key.normalize!(key)
4534
end
4635

47-
normalized['authorized_users'].each do |authorized_user|
48-
authorized_user_bag = data_bag_proc.call(node['ssh_keys']['databag'], authorized_user)
36+
normalized[:authorized_users].each do |authorized_user|
37+
authorized_user_bag = data_bag_proc.call(authorized_user)
4938

5039
raise Chef::Exceptions::ConfigurationError, "User #{authorized_user} does not exist" if authorized_user_bag.nil?
5140

5241
authorized_user_bag['keys'].each do |authorized_user_key|
53-
normalized['authorized_keys'] << PMSIpilot::SshKeys::Key.normalize!(authorized_user_key)['pub']
42+
normalized[:authorized_keys] << PMSIpilot::SshKeys::Key.normalize!(authorized_user_key)['pub']
5443
end
5544
end
5645

providers/key.rb

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
use_inline_resources
2+
3+
action :create do
4+
username = new_resource.name
5+
6+
user = PMSIpilot::SshKeys::User.normalize!(
7+
username,
8+
{
9+
:authorized_keys => new_resource.authorized_keys,
10+
:authorized_users => new_resource.authorized_users
11+
},
12+
Proc.new do |item|
13+
data_bag_item(new_resource.data_bag, item)
14+
end
15+
)
16+
17+
directory "#{user[:home]}/.ssh" do
18+
owner username
19+
group username
20+
mode '0600'
21+
action :create
22+
23+
not_if "test -e #{user[:home]}/.ssh"
24+
end
25+
26+
user[:keys].each do |key|
27+
key = PMSIpilot::SshKeys::Key.normalize!(key)
28+
29+
file "#{user[:home]}/.ssh/#{key['id']}.pub" do
30+
owner username
31+
group username
32+
mode '0600'
33+
content key['pub']
34+
not_if { key['pub'].empty? }
35+
end
36+
37+
file "#{user[:home]}/.ssh/#{key['id']}" do
38+
owner username
39+
group username
40+
mode '0600'
41+
content key['priv'].kind_of?(Array) ? key['priv'].join("\n") : key['priv']
42+
end
43+
end
44+
45+
template "#{user[:home]}/.ssh/authorized_keys" do
46+
source 'authorized_keys.erb'
47+
owner username
48+
group username
49+
mode '0600'
50+
variables keys: user[:authorized_keys]
51+
end
52+
end

recipes/default.rb

+3-44
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,7 @@
1-
raise Chef::Exceptions::ConfigurationError, 'No configuration for cookbook' if node['ssh_keys']['users'].nil? || node['ssh_keys']['users'].empty?
2-
31
node['ssh_keys']['users'].each do |username, user|
4-
user = PMSIpilot::SshKeys::User.normalize!(
5-
username,
6-
user,
7-
node,
8-
Proc.new do |name, item|
9-
data_bag_item(name, item)
10-
end
11-
)
12-
13-
directory "#{user['home']}/.ssh" do
14-
owner username
15-
group username
16-
mode '0600'
2+
ssh_keys_key username do
3+
authorized_keys user['authorized_keys']
4+
authorized_users user['authorized_users']
175
action :create
18-
19-
not_if "test -e #{user['home']}/.ssh"
20-
end
21-
22-
user['keys'].each do |key|
23-
key = PMSIpilot::SshKeys::Key.normalize!(key)
24-
25-
file "#{user['home']}/.ssh/#{key['id']}.pub" do
26-
owner username
27-
group username
28-
mode '0600'
29-
content key['pub']
30-
not_if { key['pub'].empty? }
31-
end
32-
33-
file "#{user['home']}/.ssh/#{key['id']}" do
34-
owner username
35-
group username
36-
mode '0600'
37-
content key['priv'].kind_of?(Array) ? key['priv'].join("\n") : key['priv']
38-
end
39-
end
40-
41-
template "#{user['home']}/.ssh/authorized_keys" do
42-
source 'authorized_keys.erb'
43-
owner username
44-
group username
45-
mode '0600'
46-
variables keys: user['authorized_keys']
476
end
487
end

resources/key.rb

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
actions :create, :delete
2+
default_action :create
3+
4+
attribute :username,
5+
:kind_of => String,
6+
:required => true,
7+
:name_attribute => true
8+
9+
attribute :data_bag,
10+
:kind_of => String,
11+
:default => 'ssh_keys'
12+
13+
attribute :authorized_keys,
14+
:kind_of => Array,
15+
:default => []
16+
17+
attribute :authorized_users,
18+
:kind_of => Array,
19+
:default => []

0 commit comments

Comments
 (0)