Как создать пользователя с таким же UID (только если он не существует), не затрагивая серверы, имеющие того же пользователя со случайными UID. Чтобы лучше понять: 1. Поддерживайте пользователя user1 во всем парке серверов с одинаковым UID. 2. На значительном количестве серверов есть один и тот же пользователь со случайным UID. В этом случае марионеточный класс ничего не должен делать
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',
}
Любая помощь приветствуется.
Чтобы сделать то, что вы описываете, вам понадобится нестандартный факт чтобы проверить наличие user1 и сделать что-то условно в зависимости от состояния в этой системе.
Возможно, вы параметризуете UID на основе существования user1. Если уже есть user1, не управляйте 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',
}
Или, что еще хуже, оберните свое творение пользователя в Ресурс Exec с помощью сценария оболочки.
Оба эти варианта не самые лучшие, но, учитывая то, что вы просили, это то, что вы можете сделать. Лично я бы посмотрел, что потребуется для переноса UID пользователя user1 в системы, где он не согласован. Это может потребовать больше усилий, но со временем окупится.
РЕДАКТИРОВАТЬ:
Я запустил сценарий на основе ваших комментариев и подтвердил свою озабоченность. Функции Puppet выполняются Puppetserver. Итак, написанное вами условие зависит не от состояния user1 на клиенте, а от ведущего.
Я начал с добавления пользователя user1 в клиентскую систему Puppet. Затем я взял ваш код и создал файл 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..": }
}
Когда я запустил этот файл с puppet apply
, Я получаю ожидаемый результат, когда пользователь уже существует, потому что команда внутри inline_template()
выполняется локально. (Это тот же результат, если пользователь существовал на хосте 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
Когда я помещаю код на свой сервер Puppetserver и запускаю агент марионеток, он пытается изменить существующего пользователя. Вы описали это как нежелательный результат.
[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'
...
Если пользователь существует на Puppetserver, но не на клиенте, он не добавляется, потому что getent
функция успешно возвращается на 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
Боюсь, что вам нужно пересмотреть свое решение, чтобы получить желаемый результат. Если вы запустите свое решение, вы можете случайно изменить UID.