Марионетка создание пользователя с условием

Как создать пользователя с таким же 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
задан 6 May 2019 в 13:21
1 ответ

Для того, чтобы сделать то, что вы описываете, вам понадобится пользовательский Факт , чтобы проверить существование пользователя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.

.
0
ответ дан 4 December 2019 в 03:00

Теги

Похожие вопросы