
Ich erstelle einBenutzerwie folgt
user { $username:
comment => "$name",
shell => "$shell",
managehome => false,
password => "$password",
groups => $groups
}
Wie Sie sehen, mache ichein Managehome ist falsch Jetzt muss ich später eine Datei in das Home-Verzeichnis des Benutzers übertragen.
$key = "${homedir}/${name}/file"
file { $key:
ensure => present,
owner => $username,
group => $username,
mode => 600,
content => "$keyvalue",
subscribe => User[$username],
}
Wie erhalte ich dieHome-Verzeichnis des Benutzersdafür?
Antwort1
Hm, ich denke, dazu brauchen Sie ein Faktormodul und eine kleine gehackte Manifestdatei ...
Facter-Modul: Dadurch werden Facter-Variablen für alle Benutzer registriert, z. B. „home_root“ oder „home_apache“.
require 'etc'
Etc.passwd { |user|
Facter.add("home_#{user.name}") do
setcode do
user.dir
end
end
}
und dann können Sie sie in Ihrer Manifestdatei wie folgt verwenden:
$username = "root"
$home = "home_$username"
$home_path = inline_template("<%= scope.lookupvar('::$home') %>")
file { "$home_path/test.txt":
content => "huhu",
}
Vielleicht gibt es einen besseren Weg, aber ich fürchte, nein.
Antwort2
Ich habe versucht, eine Lösung für genau dasselbe Problem zu finden, und es stellte sich heraus, dass ein etwas anderer Ansatz das Beste ist.
Definieren Sie das Home-Verzeichnis explizit, zum Beispiel:
user { $username:
comment => "comment",
home => "/home/${username}",
managehome => false,
# ...
}
Wenn managehome
false ist, wird das Home-Verzeichnis nicht einmal erstellt. Sie müssen es also speziell definieren. Oft ist es am besten, eine benutzerdefinierte Definition für den gesamten Benutzer vorzunehmen:
define custom_user($username, $password) {
user { $username:
home => "/home/${username}",
password => $password,
# etc.
}
file { "/home/${username}":
ensure => directory,
owner => $username,
require => User[$username],
# etc.
}
}
Sie können beispielsweise weitere Parameter hinzufügen $keyvalue
und eine Schlüsseldatei erstellen, wenn dieser Parameter angegeben ist.
Sie können auch eine globale Variable $home = "/home"
(betriebssystemspezifisch, falls erforderlich) definieren und mit das Home-Verzeichnis abrufen "${home}/${username}"
.
Bearbeiten: Verwenden von Hash zum Definieren benutzerspezifischer Home-Verzeichnisse
Neuere Puppet-Versionen (>= 2.6) unterstützen Hashes. Es wäre möglich, einen Hash zu definieren, der username => /path/to/home
Zuordnungen für jeden Benutzer enthält:
$home = {
normal_user => '/home/normal_user',
backup => '/var/backup',
mysql => '/var/lib/mysql'
}
Für jeden Benutzernamen ist es dann einfach, mit das Home-Verzeichnis abzurufen $home['username']
.
Home-Verzeichnis-Hash mit Fallback
In den meisten Fällen ist es am besten, einen „Fallback-Standard“ zu haben, wenn der Benutzer im Hash nicht vorhanden ist.In der Theoriedies ist möglich, allerdings wird die Syntax etwas kryptisch und aufgebläht:
$home = { ... }
$default_home = '/home'
user {$username:
home => has_key($home, $username) ? {
true => $home[$username],
false => "${default_home}/${username}"
}
# ...
}
Antwort3
Diese Frage ist alt, aber immer noch relevant. Es gibt jetzt tatsächlich einen besseren Weg. Fügen Sie eine benutzerdefinierte Tatsache hinzu[Modul]/lib/facter/home_dirs.rbmit folgendem Inhalt:
require 'etc'
Facter.add(:home_dirs) do
setcode do
home_dirs = {}
Etc.passwd { |user|
home_dirs[user.name] = user.dir
}
home_dirs
end
end
Anschließend können Sie folgendermaßen auf die Daten im Manifest zugreifen:
$facts['home_dirs']['some_username']
Beachten Sie, dass dies nur funktioniert, wenn der Benutzer bereits vor dem Puppet-Lauf existiert. Wenn der Benutzer während des Laufs erstellt wird, sollte das Home-Verzeichnis bereits bekannt oder zumindest vorhersehbar sein. Puppet ist schließlich darauf ausgelegt, Ordnung zu schaffen.
Hoffe, das hilft jemandem.
Antwort4
Wenn dasKontenModul verfügbar ist und alle Konten über Hiera erstellt werden, dann erstellt der folgende Block eine Datei im Home-Verzeichnis jedes Benutzers, vorausgesetzt, Sie interessieren sich nicht für Systembenutzerkonten außer 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],
}
}
Dies $user_home_dir
sollte für alle Benutzer richtig sein, die
- verwaltet mit
accounts
, - sind gewährleistet
present
- für nicht standardmäßige
home
Verzeichnisse.