Puppet: Home-Verzeichnis des Benutzers abrufen

Puppet: Home-Verzeichnis des Benutzers abrufen

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 managehomefalse 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 $keyvalueund 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/homeZuordnungen 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_dirsollte für alle Benutzer richtig sein, die

  1. verwaltet mit accounts,
  2. sind gewährleistetpresent
  3. für nicht standardmäßige homeVerzeichnisse.

verwandte Informationen