Thay vì sử dụng ssh_authorized_key
tài nguyên, tôi quyết định xác định một authorized_keys
tài nguyên, trong đó có một danh sách tất cả các khóa SSH cho một người dùng. Định nghĩa trông như thế này:
define authorized_keys ($sshkeys, $ensure = "present", $home = '') {
# This line allows default homedir based on $title variable.
# If $home is empty, the default is used.
$homedir = $home ? {'' => "/home/${title}", default => $home}
file {
"${homedir}/.ssh":
ensure => "directory",
owner => $title,
group => $title,
mode => 700,
require => User[$title];
"${homedir}/.ssh/authorized_keys":
ensure => $ensure,
owner => $ensure ? {'present' => $title, default => undef },
group => $ensure ? {'present' => $title, default => undef },
mode => 600,
require => File["${homedir}/.ssh"],
content => template("authorized_keys.erb");
}
}
$ssh_keys
tham số lấy tất cả các khóa cần thiết làm danh sách. Các authorized_keys.erb
mẫu trông như thế này:
# NOTICE: This file is autogenerated by Puppet and should not be modified
<% sshkeys.each do |key| -%>
<%= key %>
<% end -%>
Sử dụng
user {'mikko':
...
}
authorized_keys {'mikko':
sshkeys => [
'ssh-rsa XXXXXXYYYYYYYYYZZZZZZZZZ mikko@domain.tld',
'ssh-rsa XXXXXXZZZZZZZZZHHHHHHHHH mikko@other-host.tld',
],
}
Thêm khóa SSH một cách có điều kiện (ví dụ trong các lớp khác nhau) cũng dễ dàng, nhờ +>
toán tử của Puppet :
Authorized_keys <| title == 'mikko' |> {
sshkeys +> 'ssh-rsa ASDFASDFASDFASDF mikko@somewhere-else.tld'
}
Với phương pháp này, người dùng sẽ không bao giờ có các khóa không được chỉ định rõ ràng trong cấu hình Con rối. Chuỗi khóa được sử dụng trong ủy quyền như chính nó, vì vậy việc thêm các tùy chọn và hạn chế là không đáng kể.
Tôi sẽ rất vui khi biết người khác đã sử dụng phương pháp này thành công!