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.