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

Есть ли способ, чтобы марионетка создавала домашнюю папку пользователя (managehome), но не удаляла ее, когда гарантия «отсутствует»?

Моя первая мысль была примерно такой:

define my_user( $name = $title, $ensure = present, $uid, $gid, $password, $groups, $comment, $shell ) {
    $managehome = $ensure ? {
        present => true,
        default => false,
    }
    user { $name:
        ensure     => $ensure,
        managehome => $managehome,
        uid        => $uid,
        gid        => $gid,
        password   => $password,
        groups     => $groups,
        comment    => $comment,
        shell      => $shell,
     }
}

Пара проблем с этим:

Возможно, есть либо:

Есть у кого-нибудь рекомендации?

Есть несколько способов справиться с этим, вы можете просто использовать тернарную проверку прямо в объявлении пользователя, например:

user { $user:
  ensure     => $ensure,
  managehome => $ensure ? { present => true, default => false, },
  uid        => $uid,
  gid        => $gid,
  password   => $password,
  groups     => $groups,
  comment    => $comment,
  shell      => $shell,
}

Предполагается, что вы здесь параметризуете свои значения, и я предполагаю, что это не обязательно так. У вас по-прежнему будет проблема с обновлением всех ссылок на типы, что может быть немного болезненным. Вместо этого вы можете использовать что-то гораздо более мощное, create_resources функция. Рассмотрим следующий отрывок из файла марионетки:

class profile::base {
  $user_params = {
      'user1'     => { ensure     => absent,
                       managehome => false,
                       uid        => '1337',
                       gid        => dev,
                     },
      'user2'     => { uid        => '1338',
                       gid        => ops,
                       groups     => ['wheel', 'company'],
                     },
  }

  $user_defaults = {
      ensure        => present,
      managehome    => true,
      groups        => ['users', 'company'],
      comment       => 'Managed by puppet',
      shell         => '/bin/bash',
  }

  create_resources(user, $user_params, $user_defaults)

  ...
}

В итоге здесь происходит то, что функция create_resources принимает хеш $ user_params и динамически создает ресурс для каждой записи, используя предоставленные параметры. Кроме того, любые параметры, не предоставленные $ user_params использовать значения из $ user_defaults хэш. Приведенный выше код эффективно оценивает следующий фрагмент. (Если вы не знакомы с функцией create_resources, я настоятельно рекомендую прочитать об этом Вот)

class profile::base {

  user { 'user1':
    ensure     => absent,
    managehome => false,
    uid        => 1337,
    gid        => dev,
    groups     => ['users', 'company'],
    comment    => 'Managed by puppet',
    shell      => '/bin/bash',
  }

  user { 'user2':
    ensure     => present,
    managehome => true,
    uid        => 1338,
    gid        => ops,
    groups     => ['wheel', 'company'],
    comment    => 'Managed by puppet',
    shell      => '/bin/bash',
  }

  ...
}

Это позволяет вам быстро добавлять / изменять атрибуты для всех пользователей, которыми вы хотите управлять, без необходимости искать каждую ссылку. Скажем, если вы хотите перейти на использование ksh для своей компании, вы просто измените значение в user_defaults хэш, чтобы отразить это. Также ничто не мешает вам иметь разные группы параметров и значений по умолчанию (например, $ root_params и $ root_defaults для ваших суперпользователей) и иметь еще один вызов функции create_resources.

Развивая эту идею еще на один шаг, вы можете связать ее с данными из Hiera Тогда решение будет выглядеть так:

class profile::base {
  $user_params = hiera("user-params")
  $user_defaults = hiera("user-defaults")

  create_resources(user, $user_params, $user_defaults)

  ...
}

Намного чище и удобнее для чтения. Соответствующие Hieradata json будет выглядеть так:

{
  "user-params": {
                  "user1": {
                            "ensure": "absent",
                            "managehome": "false",
                            "uid": "1337",
                            "gid": "dev"
                  },

                  "user2": {
                            "uid": "1338",
                            "gid": "ops",
                            "groups": ["wheel", "company"]
                  }
  },

  "user_defaults": {
                    "ensure": "present",
                    "managehome": "true",
                    "groups": ["users", "company"],
                    "comment": "Managed by puppet",
                    "shell": "/bin/bash"
  }
}

Я лично предпочитаю JSON для своих hieradata, но YAML также является жизнеспособным вариантом (Источники данных Hiera) Самое приятное в Hiera заключается в том, что вы можете использовать разные источники данных на основе любых критериев, которые вы решите и настроите в файле hiera.yaml (обычно это делается для каждой среды, но может быть для каждого узла)

В качестве последней мысли вы можете подумать о написании настраиваемого типа для обертывания типа пользователя, который:

  • Заархивируйте домашний каталог пользователя, если убедитесь, что => отсутствует
  • Найдите и восстановите заархивированный каталог, если убедитесь, что => присутствует
  • Обычно используйте встроенный тип пользователя с помощью managehome => true

Если вы решите пойти по этому пути, вы все равно получите много пользы от использования create_resources функция и Hiera

В этом сценарии есть менее чем элегантный подход к необязательным параметрам.

my_user($ensure = 'present', $uid = undef) {
    if $uid != undef { User { uid => $uid } }
    user { $name: ensure => $ensure }
}

Вы просто назначаете ресурсы по умолчанию для user в рамках определения. Вы можете повторить этот шаблон для произвольного количества параметров.