Лялька: Отримайте домашній каталог користувачів


13

Я створюю користувача наступним чином

user { $username:
    comment => "$name",
    shell   => "$shell",
    managehome => false,
    password  => "$password",
    groups => $groups
}

Тепер, як ви можете бачити, що я роблю управляючу домівку, неправда. Пізніше пізніше по смузі мені потрібно натиснути файл на домашній каталог користувача.

$key = "${homedir}/${name}/file"

    file { $key:
    ensure => present,
    owner  => $username,
    group  => $username,
    mode   => 600,
    content => "$keyvalue",
    subscribe => User[$username],
}

Як я можу отримати для цього домашній каталог користувача ?

Відповіді:


12

Гм, я думаю, що для цього вам знадобиться факторний модуль і трохи маніфестований файл маніфесту ...

Модуль facter: це зареєструє facter змінні для всіх користувачів. як-от "home_root" або "home_apache".

require 'etc'

Etc.passwd { |user|

   Facter.add("home_#{user.name}") do
      setcode do
         user.dir
      end
   end

}

а потім ви можете використовувати їх у вашому файлі маніфесту таким чином:

$username = "root"
$home = "home_$username"
$home_path = inline_template("<%= scope.lookupvar('::$home') %>")

file { "$home_path/test.txt":
   content => "huhu",
}

Можливо, є кращий спосіб, але я не боюся.


Чи можете ви дати мені кілька порад про те, куди подіти цей маніфест? У мене є основний клас в init.pp, і куди я їхати звідти?
Квінтін,

1
@QuintinPar Я щойно почав завантажувати в Github кілька прикладів ляльок чи кращих практик. Ви знайдете цей приклад (клас facter) тут: github.com/drandor/puppet-examples/tree/master/modules/user, для вашого майстра та вашого агента потрібно активувати плагінсинхронізацію. другий код можна використовувати будь-де у ваших * .pp-файлах. Конфігурацію ляльок і маніфести (з етапами) можна знайти тут: github.com/drandor/puppet-config
jfried

1
Якщо користувача ще не існує на машині (додається новий користувач), факт home_user недоступний. Для створення нових користувачів можуть знадобитися два запуски ляльок. Під час першого запуску $ home_path порожній, і це може призвести до небажаних результатів.
Мікко

4

Я намагався знайти рішення саме такої проблеми, і виявилося, що краще скористатися трохи іншим підходом.

Визначте домашній каталог чітко, наприклад:

user { $username:
    comment    => "comment",
    home       => "/home/${username}",
    managehome => false,
    # ...
}

Коли managehomefalse, домашній каталог навіть не створений. Отже, ви повинні це конкретно визначити. Найчастіше найкраще зробити власне визначення для всього користувача:

define custom_user($username, $password) {
    user { $username:
        home     => "/home/${username}",
        password => $password,
        # etc.
    }
    file { "/home/${username}":
        ensure  => directory,
        owner   => $username,
        require => User[$username],
        # etc.
    }
}

Наприклад $keyvalue, ви можете додати більше параметрів і створити файл з ключами, якщо цей параметр заданий.

Ви також можете визначити глобальну змінну $home = "/home"(специфічну для ОС, якщо потрібно) та отримати домашній dir "${home}/${username}".

Редагувати: Використовуючи хеш для визначення домашніх каталогів конкретних користувачів

Більш недавні версії ляльок (> = 2.6) підтримують хеші. Можна було б визначити хеш, що містить username => /path/to/homeвідображення для кожного користувача:

$home = {
    normal_user => '/home/normal_user',
    backup      => '/var/backup',
    mysql       => '/var/lib/mysql'
}

Для будь-якого імені користувача легко отримати домашній каталог $home['username'].

Хеш домашнього каталогу із резервним

У більшості випадків найкраще мати "резервний замовчування", якщо користувача не існує в хеші. Теоретично це можливо, хоча синтаксис стає трохи кричущим і роздутим:

$home = { ... }
$default_home = '/home'

user {$username:
    home => has_key($home, $username) ? {
                true => $home[$username], 
                false => "${default_home}/${username}" 
            }
    # ...
}

2
Це працює, коли / home не є типовим. say / var / lib / psql
Quintin Par

@Barry: Чи читали ви решту відповідей, "домашні довідники для користувачів"? (Відповідь було відредаговано після коментаря Квінтіна Пар)
Мікко

@Mikko Yeap, і я намагався підтвердити правильну (прийняту) відповідь. Це було заблоковано.

1

Це питання давнє, але все ще актуальне. Зараз насправді є кращий шлях. Додайте власний факт у [module] /lib/facter/home_dirs.rb, що містить таке:

require 'etc'

Facter.add(:home_dirs) do
  setcode do

    home_dirs = {}   
    Etc.passwd { |user|
      home_dirs[user.name] = user.dir
    }

    home_dirs

  end
end

Тоді ви можете отримати доступ до даних у маніфесті таким чином:

$facts['home_dirs']['some_username']

Майте на увазі, що це працює лише в тому випадку, якщо користувач вже існує до запуску ляльки. Якщо користувач створюється під час виконання, домашній каталог повинен бути вже відомим або принаймні передбачуваним. Лялька призначена для створення порядку.

Сподіваюся, що це комусь допоможе.


0

Коли модуль облікових записів доступний і всі облікові записи створюються за допомогою ієра, то внизу блоку створюється файл у домашньому каталозі кожного користувача, припускаючи, що ви не переймаєтесь обліковими записами системних користувачів, крім root.

require accounts::user::defaults

# filter out accounts with ensure=absent or managehome=false 
$managed_accounts = $accounts::user_list.filter |$name, $account| {
  (!has_key($account, 'managedhome') or $account['managedhome']) and (!has_key($account, 'ensure') or $account['ensure']!='absent')
}

# Add a file to each users
$managed_accounts.each |$name, $account| {
  $user_home_dir = has_key($account, 'home') ? {
    true    => $account['home'],
    default => $name ? {
      'root'  => $accounts::user::defaults::root_home,
      default => $accounts::user::defaults::home_template.sprintf($name),
    },
  }

  # Push a file to the user’s home directory.
  file { "${user_home_dir}/.helloworld":
    ensure  => file,
    owner   => $name,
    content => "Hi ${name}",
    require => User[$name],
  }
}

Це $user_home_dirмає бути правильним для всіх користувачів, які є

  1. вдалося accounts,
  2. гарантовано бути present
  3. для нестандартних homeкаталогів.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.