Gerando recursos do Puppet a partir da matriz de hashes

3

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).

    
por drdaeman 15.05.2012 / 23:37

1 resposta

5

Você precisará usar create_resource em vez de declarar:

staff::ssh_key { $ssh_keys:
    user => $name,
}

Para manter a conveniência do usuário = > $ name:

Staff::Ssh_key {
     user => $name,    
}

create_resources('staff::ssh_key', $ssh_keys)

Altere também ssh_keys para um hash em vez de um array na equipe {... ssh_keys = > {}}

    
por 16.05.2012 / 05:45