Ajout d'un utilisateur existant à un groupe avec marionnette

16

Est-il possible d'ajouter un utilisateur existant à un groupe avec la marionnette 2.7.18?

Nous avons deux modules, chacun définit une classe:

  • le module "utilisateur" crée tous les utilisateurs, y compris l'utilisateur foo et la barre d'utilisateurs.
  • le module "subversion" traite de divers fichiers de conf et crée un groupe svn.

Nous aimerions ajouter l'utilisateur foo au groupe svn dans le module "subversion".

J'ai essayé le paramètre d'appartenance comme décrit dans la demande de fonctionnalité existante :

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

Mais j'obtiens l'erreur suivante:

err: impossible de récupérer le catalogue du serveur distant: erreur 400 sur le serveur: déclaration en double: l'utilisateur [foo] est déjà déclaré dans le fichier /pathto/modules/subversion/manifests/init.pp à la ligne xx; ne peut pas redéclarer dans /pathto/modules/users/manifests/init.pp:xxx sur le noeud myserver.example.com

Cette fonctionnalité est-elle déjà implémentée? Sinon, existe-t-il une bonne solution de contournement?


la source

Réponses:

15

Si vous déclarez des utilisateurs en tant que ressources virtuelles , vous pouvez alors utiliser «réaliser» ou la syntaxe de collection (utilisateur <| ... |>). Voici un exemple:

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

Ensuite, réalisez cet utilisateur virtuel avec la syntaxe de la collection:

User <| title == foo |>

Et ailleurs, vous pouvez ajouter aux paramètres de cette ressource virtuelle en utilisant plusignment:

User <| title == foo |> { groups +> "svn" }
dotplus
la source
Donc je suppose qu'il n'y a pas d'autre alternative que les ressources virtuelles pour le moment :( Merci beaucoup pour la réponse.
1
Il y a une faute de frappe ou un attribut changé entre les versions de Puppet: Ce n'est pas un groupe mais des groupes (pluriel). Utilisation de Puppet 3.2.2
Goran Miskovic
1
quelqu'un peut-il développer cela avec un court exemple.
mschuett
21

L'utilisation de ressources virtuelles Puppet est la bonne façon de le faire - mais si vous ne pouvez pas modifier les définitions d'utilisateur et avez besoin d'une solution de contournement en attendant, ce qui suit est horrible et hacky, mais fonctionnera:

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

Essentiellement, nous vérifions simplement si un groupe contient encore foo utilisateur ... sinon, utilisez les commandes usermod normales pour l'ajouter en plus des groupes existants auxquels foo appartient.

dodocaptain
la source
1
Puppet peut riquire des chemins d'accès complets aux exécutables. Modifié pour refléter cela.
h7r le
2
Horrible et hacky, mais vraiment utile. J'espérais ne pas avoir à apprendre une nouvelle construction de langage pour faire quelque chose d'aussi conceptuellement simple que d'ajouter un utilisateur à un groupe.
BillMan
1
Peut-être qu'une façon plus appropriée (tout en étant encore hacky bien sûr) serait d'utiliser getent group somegroup|cut -d: -f4|grep -q foopour ne pas supposer que nous utilisons /etc/group.
falstro
Super utile - merci. J'ai dû changer le "à moins" et "usermod" pour inclure le chemin complet comme suit: à moins que => "/ user / bin / grep ..." command => "/ user / bin / usermod ..."
JNP Développeur Web
Pour @jnpWebDeveloper et ceux qui leur ressemblent: selon la documentation , vous pouvez également spécifier un pathparamètre. Je suggère d'avoir une ressource globale par défaut, peut-être qui tire $PATHdu facteur.
cincodenada
2

Merci - laid hack c'est sûr, mais ça fait le boulot. Voici un exemple de chemin (combinant les commentaires ci-dessus) pour ajouter «nrpe» au groupe «nagios». J'ai utilisé un package requis car l'utilisateur ici est RPM fourni plutôt que par marionnette.

  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
la source