Adicionando um usuário existente a um grupo com fantoche

16

É possível adicionar um usuário existente a um grupo com o fantoche 2.7.18?

Temos dois módulos, cada um define uma classe:

  • O módulo "usuário" cria todos os usuários, incluindo o usuário foo e a barra do usuário.
  • O módulo "subversion" lida com vários arquivos conf e cria o grupo svn.

Gostaríamos de adicionar o usuário foo ao grupo svn dentro do módulo "subversion".

Eu tentei o parâmetro de associação conforme descrito na solicitação de recurso existente :

group {
"svn":
    ensure  => present,
    gid     => xxxxx;
}
user {
"foo":
    group      => ["svn"],
    membership => minimum;
}

Mas eu recebo o seguinte erro:

err: Não foi possível recuperar o catálogo do servidor remoto: Erro 400 no SERVIDOR: Declaração duplicada: o usuário [foo] já está declarado no arquivo /pathto/modules/subversion/manifests/init.pp na linha xx; não é possível redefinir em /pathto/modules/users/manifests/init.pp:xxx no nó myserver.example.com

Esse recurso já está implementado? Caso contrário, existe uma boa solução alternativa?


fonte

Respostas:

15

Se você declarar usuários como recursos virtuais , poderá usar 'realize' ou a sintaxe da coleção (Usuário <| ... |>). Aqui está um exemplo:

@user { 'foo':
  groups     => ['somegroup'],
  membership => minimum,
}

Em seguida, realize esse usuário virtual com a sintaxe da coleção:

User <| title == foo |>

E em outro lugar, você pode adicionar aos parâmetros desse recurso virtual usando plusignment:

User <| title == foo |> { groups +> "svn" }
dotplus
fonte
Então eu acho que não há alternativa a não ser ressources virtuais neste momento :( Muito obrigado pela resposta.
11
Há um erro de digitação ou atributo alterado entre as versões do Puppet: não é grupo, mas grupos (plural). Usando Puppet 3.2.2
Goran Miskovic
11
alguém pode expandir isso com um pequeno exemplo.
mschuett
21

Usar os recursos virtuais do Puppet é a maneira certa de fazê-lo - mas se você não puder alterar as definições do usuário e precisar de uma solução alternativa, o seguinte é horrível e hacky, mas funcionará:

exec { 'foo somegroup membership':
  unless  => '/bin/grep -q "somegroup\\S*foo" /etc/group',
  command => '/sbin/usermod -aG somegroup foo',
  require => User['foo'],
}

Basicamente, apenas verificamos se algum grupo ainda contém usuário foo ... se não, use os comandos usuais usermod para adicioná-lo, além dos grupos existentes aos quais foo pertence.

dodocaptain
fonte
11
O Puppet pode atrair caminhos totalmente qualificados para os executáveis. Editado para refletir isso.
H7r
2
Horrível e hacky, mas realmente útil. Eu esperava não ter que aprender uma nova construção de linguagem para fazer algo conceitualmente simples como adicionar um usuário a um grupo.
Billman
11
Talvez uma maneira mais adequada (embora ainda seja hacky, é claro) seria usar getent group somegroup|cut -d: -f4|grep -q foopara não assumir que estamos usando /etc/group.
falstro
Super útil - obrigado. Eu tive que mudar o "a menos" e "usermod" para incluir o caminho completo da seguinte maneira: a menos que o comando => "/ user / bin / grep ..." = = "" / user / bin / usermod ... "
JNP Desenvolvedor Web
Para @jnpWebDeveloper e similares: conforme a documentação , você também pode especificar um pathparâmetro. Eu sugiro ter um padrão global de recursos, talvez isso $PATHocorra de maneira diferente.
Cincodenada
2

Obrigado - corte feio, com certeza, mas faz o trabalho. Aqui está um exemplo de caminho (combinando os comentários acima) para adicionar 'nrpe' ao grupo 'nagios'. Eu usei um pacote exigido, pois o usuário aqui é fornecido por RPM, e não por fantoche.

  exec {"nrpe nagios membership":
    unless => "/bin/getent group nagios|/bin/cut -d: -f4|/bin/grep -q nrpe",
    command => "/usr/sbin/usermod -a -G nagios nrpe",
    require => Package['nrpe'],
  }
Bill McGonigle
fonte