我使用木偶来分发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的不同的方法,但同样的净效果。