以下のように、Puppetを使用して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以降、user
タイプを介して 管理されていない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]',
],
}
Puppetの+>
演算子のおかげで、SSHキーを条件付きで(たとえば、異なるクラスで)追加することも簡単です。
Authorized_keys <| title == 'mikko' |> {
sshkeys +> 'ssh-rsa ASDFASDFASDFASDF [email protected]'
}
この方法では、Puppet設定で明示的に指定されていないキーをユーザーが持つことはありません。キー文字列は、authorized_keysでそのまま使用されるため、オプションと制限を追加するのは簡単です。
他の人がこの方法をうまく利用できたら嬉しいです!
resourcesメタタイプを使用してこれを実行できるはずです。例えば。
resources { 'ssh_authorized_key': noop => true, purge => true, }
設定noop => true,
削除が行われないようにします。代わりに、人形は削除されるものを報告します。必要な場合は、noopステートメントを削除します。
アンマネージリソースで操作を実行するための理想的な構文は 議論中 です。
編集:コメントで述べたように、この答えは機能しません。
Puppet Forgeでは、この機能を提供するモジュールがApache Licenseバージョン2.0で公開されています。
ただし、テンプレートではなくPuppet連結に依存しています。
https://github.com/nightfly19/puppet-ssh_keys/tree/master/manifests
キーの配列をパラメータとして渡す代わりに、キーごとに個別のエントリを定義します。
Mikkoのアプローチとは異なりますが、最終結果は同じです。