我正在使用 puppet 分发 SSH 密钥,如下所示:
ssh_authorized_key { "alice@foo.com":
ensure => present,
key => 'xxxx',
type => 'ssh-rsa',
user => 'deploy',
}
Run Code Online (Sandbox Code Playgroud)
~/.ssh/authorized_keys 文件最终包含来自多个类的密钥的混合,这是所需的结果。但是,如果手动将密钥添加到 $HOME/.ssh/authorized_keys,Puppet 会将其保留在原位。有没有办法始终删除清单中未明确定义的任何键?
我有木偶版本 2.7.1。
Mik*_*kko 13
ssh_authorized_key我决定不使用资源,而是定义一个authorized_keys资源,该资源获取单个用户的所有 SSH 密钥列表。定义看起来像这样:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
$ssh_keys参数将所有必要的键作为列表。该authorized_keys.erb模板看起来是这样的:
# NOTICE: This file is autogenerated by Puppet and should not be modified
<% sshkeys.each do |key| -%>
<%= key %>
<% end -%>
Run Code Online (Sandbox Code Playgroud)
user {'mikko':
...
}
authorized_keys {'mikko':
sshkeys => [
'ssh-rsa XXXXXXYYYYYYYYYZZZZZZZZZ mikko@domain.tld',
'ssh-rsa XXXXXXZZZZZZZZZHHHHHHHHH mikko@other-host.tld',
],
}
Run Code Online (Sandbox Code Playgroud)
有条件地添加 SSH 密钥(例如在不同的类中)也很容易,这要归功于 Puppet 的+>操作符:
Authorized_keys <| title == 'mikko' |> {
sshkeys +> 'ssh-rsa ASDFASDFASDFASDF mikko@somewhere-else.tld'
}
Run Code Online (Sandbox Code Playgroud)
使用此方法,用户将永远不会拥有未在 Puppet 配置中明确指定的密钥。密钥字符串在authorized_keys 中按原样使用,因此添加选项和限制是微不足道的。
我很高兴听到其他人是否成功地使用了这种方法!
从 Puppet 3.6 开始,现在可以通过类型清除非托管 SSH 授权密钥user。例如,
user { 'nick':
ensure => present,
purge_ssh_keys => true,
}
Run Code Online (Sandbox Code Playgroud)