Назад | Перейти на главную страницу

Создание пользователя Puppet с условием

Как создать пользователя с таким же 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.