Как создать пользователя с таким же 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',
}
Любая помощь приветствуется.
Для того, чтобы сделать то, что вы описываете, вам понадобится пользовательский Факт , чтобы проверить существование пользователя1 и сделать что-то условно основанное на состоянии на этой системе.
Может быть, вы параметрируете 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 пользователя1 на системы, где он не соответствует. Это может быть больше похоже на предварительные усилия, но со временем это должно окупиться.
EDIT:
Я запустил сценарий, основанный на ваших комментариях, и убедился, что меня это беспокоит. Кукловые функции выполняются Кукловодом. Итак, условие, которое вы написали, зависит не от состояния user1 от клиента, а от мастера.
Я начал с добавления user1 в клиентскую систему куклы. Затем я взял ваш код и создал файл 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 application
, я получаю ожидаемый результат, когда пользователь уже существует, потому что команда внутри inline_template()
выполняется локально. (Это тот же самый результат, если бы пользователь существовал на хосте марионеточного сервера.)
[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
Когда я ставлю код на мой марионеточный сервер и запускаю марионеточный агент, он пытается изменить существующего пользователя. Вы описали это как нежелательный результат.
[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'
...
Если пользователь существует на марионеточном сервере, но не клиент, то он не добавляется, потому что функция getent
успешно возвращается на марионеточном сервере.
[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.
.