1 votes

Création d'un utilisateur Puppet avec condition

Comment créer un utilisateur avec le même UID (seulement s'il n'existe pas) sans affecter les serveurs ayant le même utilisateur avec des UIDs aléatoires. Pour donner plus d'informations : 1. Maintenir un utilisateur, "user1", dans toute la flotte de serveurs avec le même UID. 2. Un nombre considérable de serveurs ont le même utilisateur avec un UID aléatoire. La classe Puppet ne devrait rien faire dans ce cas.

user { 'user1':
        ensure   => present,
        comment  => 'Appp user',
        uid      => 55555,
        onlyif   => <if the user1 is not present>   ---> I know there is no attribute called onlyif in 'user'
        gid      => 55555,
        home     => '/home/user1',
        shell    => '/bin/bash',
    }

Toute aide est appréciée.

0voto

Aaron Copley Points 12225

Pour faire ce que vous décrivez, vous auriez besoin d'une Fait sur mesure pour vérifier l'existence de l'utilisateur 1 et faire quelque chose de conditionnel basé sur l'état de ce système.

Peut-être que vous paramétrez l'UID en fonction de l'existence de user1. S'il y a déjà un user1, ne pas gérer l'uid.

$user1_uid = $::user1 ? {
  true => undef,
  default => 55555,
}

user { 'user1':
  ensure   => present,
  comment  => 'Appp user',
  uid      => $user1_uid,
  gid      => 55555,
  home     => '/home/user1',
  shell    => '/bin/bash',
}

Ou, pire encore, envelopper la création d'un utilisateur dans un fichier Ressource d'exécution avec un Shell Shell.

Ces deux options ne sont pas les meilleures, mais compte tenu de ce que vous avez demandé, c'est ce que vous pouvez faire. Personnellement, j'examinerais ce qu'il faudrait faire pour migrer l'UID de user1 sur les systèmes où il n'est pas cohérent. C'est peut-être un effort plus important au départ, mais il devrait être rentable au fil du temps.


EDIT :

J'ai exécuté un scénario basé sur vos commentaires et j'ai vérifié mon inquiétude. Les fonctions de Puppet sont exécutées par Puppetserver. Ainsi, la conditionnelle que vous avez écrite ne dépend pas de l'état de user1 sur le client, mais sur le maître.

J'ai commencé par ajouter user1 à un système client Puppet. Ensuite, j'ai pris votre code et créé un fichier user1.pp.

$user_id = inline_template("<%= `/usr/bin/getent passwd user1` %>") 
if ("$user_id" == "") {
  user { 'user1': 
    ensure => present,
    comment => 'App user',
    uid => 61234,
    gid => 61234,
    home => '/home/user1',
    shell => '/bin/bash', 
  } 
} else { 
  notify { "The group is already present. Skipping..": } 
}

Lorsque j'ai exécuté ce fichier avec puppet apply J'obtiens le résultat escompté lorsque l'utilisateur existe déjà, car la commande à l'intérieur de l'utilisateur est la suivante inline_template() est exécuté localement. (C'est le même résultat si l'utilisateur existait sur l'hôte de Puppetserver).

[root@localhost ~]# puppet apply /root/user1.pp 
...
Notice: The group is already present. Skipping..
Notice: /Stage[main]/Main/Notify[The group is already present. Skipping..]/message: defined 'message' as 'The group is already present. Skipping..'
Notice: Applied catalog in 0.15 seconds

Lorsque je place le code sur mon Puppetserver et que je lance l'agent Puppet, il tente de modifier l'utilisateur existant. Vous avez décrit cela comme un résultat indésirable.

[root@localhost ~]# puppet agent -t
...
Notice: /Stage[main]/User[user1]/uid: uid changed 1000 to 61234
Error: Could not find group(s) 61234
Error: /Stage[main]/User[user1]/gid: change from 1000 to 61234 failed: Could not find group(s) 61234
Notice: /Stage[main]/User[user1]/comment: comment changed '' to 'App user'
...

Si l'utilisateur existe sur le serveur Puppets mais pas sur le client, l'utilisateur n'est pas ajouté parce que l'adresse de l'utilisateur n'a pas été modifiée. getent retourne avec succès la fonction sur le Puppetserver.

[root@localhost ~]# id user1
id: user1: no such user
[root@localhost ~]# puppet agent -t
...
Notice: The group is already present. Skipping..
Notice: /Stage[main]/Notify[The group is already present. Skipping..]/message: defined 'message' as 'The group is already present. Skipping..'
Notice: Applied catalog in 19.73 seconds

Je crains que vous ne deviez reconsidérer votre solution pour obtenir les résultats souhaités. Si vous exécutez votre solution, vous risquez de modifier accidentellement l'UID.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X