
Я создаюпользовательследующим образом
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],
}
Как я могу получитьдомашний каталог пользователядля этого?
решение1
Хм, я думаю, что для этого вам понадобится модуль Factor и небольшой хакерский файл манифеста...
Модуль 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",
}
Возможно, есть лучший способ, но боюсь, что нет.
решение2
Я попытался найти решение точно такой же проблемы, и оказалось, что лучше всего использовать немного другой подход.
Явно определите домашний каталог, например:
user { $username:
comment => "comment",
home => "/home/${username}",
managehome => false,
# ...
}
Если managehome
false, домашний каталог даже не создается. Поэтому вам придется его специально определить. Часто лучше сделать индивидуальное определение для всего пользователя:
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"
(специфичную для ОС, если необходимо) и получить домашний каталог с помощью "${home}/${username}"
.
Редактировать: Использование хеша для определения домашних каталогов пользователя
Более поздние версии Puppet (>= 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}"
}
# ...
}
решение3
Этот вопрос старый, но все еще актуальный. На самом деле, сейчас есть лучший способ. Добавьте пользовательский факт в[модуль]/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']
Имейте в виду, что это работает только в том случае, если пользователь уже существует до запуска puppet. Если пользователь создается во время запуска, домашний каталог должен быть уже известен или, по крайней мере, предсказуем. В конце концов, puppet предназначен для создания порядка.
Надеюсь, это кому-то поможет.
решение4
КогдаСчетамодуль доступен и все учетные записи создаются через hiera, затем приведенный ниже блок создает файл в домашнем каталоге каждого пользователя, предполагая, что вас не интересуют системные учетные записи пользователей, кроме 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
быть верно для всех пользователей, которые
- управляемый с
accounts
, - гарантированно будут
present
- для нестандартных
home
каталогов.