A partir do Puppet 3.6, agora é possível limpar chaves autorizadas SSH não gerenciadas por meio do tipo user
. Por exemplo,
user { 'nick':
ensure => present,
purge_ssh_keys => true,
}
Estou usando o fantoche para distribuir as chaves SSH, assim:
ssh_authorized_key { "[email protected]":
ensure => present,
key => 'xxxx',
type => 'ssh-rsa',
user => 'deploy',
}
O arquivo ~ / .ssh / authorized_keys acaba contendo uma mistura de chaves de várias classes, que é o resultado desejado. No entanto, se uma chave for adicionada manualmente a $ HOME / .ssh / authorized_keys, o Puppet a deixará no lugar. Existe uma maneira de sempre remover qualquer chave que não tenha sido explicitamente definida em um manifesto?
Eu tenho a versão fantoche 2.7.1.
A partir do Puppet 3.6, agora é possível limpar chaves autorizadas SSH não gerenciadas por meio do tipo user
. Por exemplo,
user { 'nick':
ensure => present,
purge_ssh_keys => true,
}
Em vez de usar ssh_authorized_key
resources, decidi definir um recurso authorized_keys
, que recebe uma lista de todas as chaves SSH para um único usuário. A definição é assim:
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");
}
}
O parâmetro $ssh_keys
usa todas as chaves necessárias como uma lista. O modelo authorized_keys.erb
tem esta aparência:
# 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]',
],
}
A adição de chaves SSH condicionalmente (por exemplo, em classes diferentes) também é fácil, graças ao operador +>
do Puppet:
Authorized_keys <| title == 'mikko' |> {
sshkeys +> 'ssh-rsa ASDFASDFASDFASDF [email protected]'
}
Com este método, o usuário nunca terá chaves que não sejam explicitamente especificadas na configuração do Puppet. A string de chave é usada em authorized_keys exatamente como é, portanto, adicionar opções e restrições é trivial.
Eu ficaria feliz em saber se outros usuários usaram esse método com sucesso!
Você deve conseguir fazer isso usando o metatipo resources . E.G.
resources { 'ssh_authorized_key': noop => true, purge => true, }
A definição de noop => true,
impede que a remoção ocorra. Em vez disso, o fantoche relatará o que seria removido. Se for o que você deseja, remova a instrução noop .
A sintaxe ideal para executar operações em recursos não gerenciados é em discussão .
EDIT: Como mencionado nos comentários, esta resposta não funciona.
No Puppet Forge, um módulo foi publicado sob a Licença Apache, versão 2.0, que oferece essa capacidade.
No entanto, ele conta com a concatenação Puppet, em vez de modelos.
Em vez de passar um array de chaves como um parâmetro, você define entradas separadas para cada chave.
Diferente abordagem de Mikko, mas mesmo resultado líquido.