Thay vì sử dụng ssh_authorized_keytài nguyên, tôi quyết định xác định một authorized_keystà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_keystham số lấy tất cả các khóa cần thiết làm danh sách. Các authorized_keys.erbmẫ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!