Sou novo no Puppet e para começar a usá-lo, quero aprender a gerenciar os usuários do sistema.
Eu tenho vários usuários, que compartilham propriedades comuns, então achei que deveria fatorar as coisas.
Depois de alguma luta, aqui está o que eu vim com:
define staff::ssh_key($user) {
ssh_authorized_key { $name[name]:
ensure => present,
key => $name[key],
type => "ssh-rsa",
user => $user,
require => File["/home/${user}/.ssh"],
}
}
define staff($fullname, $ssh_keys, $shell = "/bin/bash") {
user { $name:
ensure => present,
comment => "${fullname},,,",
home => "/home/${name}",
managehome => true,
groups => ["users", "adm", "sudo"],
shell => $shell,
}
file { "/home/${name}/.ssh":
ensure => directory,
mode => 0700,
owner => $name,
require => User[$name],
}
staff::ssh_key { $ssh_keys:
user => $name,
}
}
Então estou declarando usuários assim:
staff { "drdaeman":
fullname => "Aleksey Zhukov",
shell => "/bin/zsh",
ssh_keys => [
{
name => "desktop",
key => "AAAA....6s=",
}
{
name => "notebook",
key => "AAAA....Q==",
}
],
}
Por enquanto, acabei de salvar ambas as partes que foram salvas em um único arquivo, chamado staff.pp
. Para configuração remota, coloquei site.pp
com o seguinte conteúdo:
node "foobar.example.org" {
import "staff.pp"
}
Enquanto tudo parece funcionar bem localmente, chamando puppet apply staff.pp
, ele falha quando usado remotamente. A execução de puppet agent --test
gera um erro:
err: Could not retrieve catalog from remote server: Could not intern from pson: Could not convert from pson: Could not find relationship source "Staff::Ssh_key[namenotebookkeyAAAA...Q==]"
err: Could not retrieve catalog; skipping run
(Estou usando o Puppet 2.7.14 no Ubuntu, do apt.puppetlabs.com, se isso for importante.)
Parece que o Puppet não gosta de hashes como nomes de recursos, pelo menos não quando os dados são transmitidos pela rede. Existe alguma maneira de contornar isso, não recorrer a copiar e colar todos os recursos ssh_authorized_key
necessários manualmente? (Isso seria muito detalhado para o meu gosto)
Observe que, nesse caso exato, posso trabalhar usando file "/home/${name}/.ssh/authorized_keys": ... }
simples em vez de ssh_authorized_key
ou usando concat::fragment
, no entanto, isso não funcionaria com outros casos semelhantes, em que alguns recursos possuem vários recursos dependentes, que não são facilmente reduzidos em um único arquivo. Em vez disso, estou procurando uma maneira relativamente genérica para possivelmente resolver essas situações e similares (se houver alguma).