使用Puppet删除未明确允许的SSH密钥

我使用木偶来分发SSH密钥,如下所示:

ssh_authorized_key { "[email protected]": ensure => present, key => 'xxxx', type => 'ssh-rsa', user => 'deploy', } 

〜/ .ssh / authorized_keys文件最终包含多个类的键的混合,这是所期望的结果。 但是,如果一个密钥被手动添加到$ HOME / .ssh / authorized_keys中,Puppet会将其保留在原位。 有没有办法总是删除清单中没有明确定义的任何键?

我有木偶版本2.7.1。

从Puppet 3.6开始,现在可以通过usertypes清除非托pipe的SSH授权密钥 。 例如,

 user { 'nick': ensure => present, purge_ssh_keys => true, } 

我决定不使用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"); } } 

$ssh_keys参数将所有必要的键作为列表。 authorized_keys.erb模板如下所示:

 # NOTICE: This file is autogenerated by Puppet and should not be modified <% sshkeys.each do |key| -%> <%= key %> <% end -%> 

用法

 user {'mikko': ... } authorized_keys {'mikko': sshkeys => [ 'ssh-rsa XXXXXXYYYYYYYYYZZZZZZZZZ [email protected]', 'ssh-rsa XXXXXXZZZZZZZZZHHHHHHHHH [email protected]', ], } 

有条件地添加SSH密钥(例如在不同的类中)也很容易,这要归功于Puppet的+>运算符:

 Authorized_keys <| title == 'mikko' |> { sshkeys +> 'ssh-rsa ASDFASDFASDFASDF [email protected]' } 

用这种方法,用户永远不会有在Puppetconfiguration中没有明确指定的键。 密钥string在authorized_keys中使用,因此添加选项和限制是微不足道的。

我会很高兴听到别人是否成功地使用了这种方法!

你应该能够使用metatype这个资源来做到这一点。 例如

 resources { 'ssh_authorized_key': noop => true, purge => true, } 

设置noop => true,防止发生删除。 相反,傀儡会报告将被删除的东西。 如果这是你想要的,删除noop声明。

正在讨论对非托pipe资源执行操作的理想语法。

编辑:正如在评论中提到的,这个答案不起作用。

在Puppet Forge上,已经发布了一个模块,该模块已经提供了这个function的Apache许可证2.0版本。

它依靠Puppet concat而不是模板。

https://github.com/nightfly19/puppet-ssh_keys/tree/master/manifests

而不是传递一个键数组作为参数,您可以为每个键定义单独的条目。

从Mikko的不同的方法,但同样的净效果。