Agregar un usuario existente a un grupo con marioneta

16

¿Es posible agregar un usuario existente a un grupo con la marioneta 2.7.18?

Tenemos dos módulos, cada uno define una clase:

  • El módulo "usuario" crea todos los usuarios, incluidos el usuario foo y la barra de usuarios.
  • El módulo "subversion" se ocupa de varios archivos conf y crea el grupo svn.

Nos gustaría agregar el usuario foo al grupo svn dentro del módulo "subversión".

He probado el parámetro de membresía como se describe en la solicitud de función existente :

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

Pero me sale el siguiente error:

err: No se pudo recuperar el catálogo del servidor remoto: Error 400 en el SERVIDOR: Declaración duplicada: El usuario [foo] ya está declarado en el archivo /pathto/modules/subversion/manifests/init.pp en la línea xx; no se puede volver a declarar en /pathto/modules/users/manifests/init.pp:xxx en el nodo myserver.example.com

¿Esta característica ya está implementada? Si no, ¿hay una buena solución?


fuente

Respuestas:

15

Si declara a los usuarios como recursos virtuales , puede usar 'realizar' o la sintaxis de recopilación (Usuario <| ... |>). Aquí hay un ejemplo:

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

Entonces date cuenta de ese usuario virtual con la sintaxis de la colección:

User <| title == foo |>

Y en otro lugar puede agregar a los parámetros para ese recurso virtual usando plusignment:

User <| title == foo |> { groups +> "svn" }
dotplus
fuente
Así que supongo que no hay alternativa, excepto recursos virtuales en este momento :( Muchas gracias por la respuesta.
1
Hay un error tipográfico o atributo cambiado entre las versiones de Puppet: no es grupo sino grupos (plural). Using Puppet 3.2.2
Goran Miskovic
1
alguien puede ampliar esto con un breve ejemplo.
mschuett
21

Usar los recursos virtuales de Puppet es la forma correcta de hacerlo, pero si no puede cambiar las definiciones de usuario y necesita una solución alternativa, lo siguiente es horrible y hacky, pero funcionará:

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

Esencialmente, solo verificamos si algún grupo contiene user foo todavía ... si no, use los comandos normales de usermod para agregarlo además de los grupos existentes a los que pertenece foo.

dodocaptain
fuente
1
Puppet podría enriquecer rutas totalmente calificadas a los ejecutables. Editado para reflejar esto.
h7r
2
Horrible y hacky, pero realmente útil. Esperaba no tener que aprender un nuevo lenguaje para hacer algo conceptualmente simple como agregar un usuario a un grupo.
BillMan el
1
Quizás una forma más adecuada (aunque todavía sea hacky, por supuesto) sería usar getent group somegroup|cut -d: -f4|grep -q foopara no asumir que estamos usando /etc/group.
falstro
Súper servicial, gracias. Tuve que cambiar "a menos" y "usermod" para incluir la ruta completa de la siguiente manera: a menos que => "/ user / bin / grep ..." command => "/ user / bin / usermod ..."
JNP Desarrollador web
Para @jnpWebDeveloper y aquellos como ellos: según la documentación , también puede especificar un pathparámetro. Sugiero tener un recurso global predeterminado, tal vez eso se extrae $PATHde facter.
cincodenada
2

Gracias - feo truco seguro, pero hace el trabajo. Aquí hay un ejemplo con parches (que combina los comentarios anteriores) para agregar 'nrpe' al grupo 'nagios'. Usé un paquete requerido ya que el usuario aquí es RPM proporcionado en lugar de títere.

  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
fuente