Marionette: Benutzerverzeichnis abrufen

12

Ich erstelle einen Benutzer wie folgt

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

Jetzt, wie Sie sehen können, mache ich eine Verwaltung, ist falsch. Später in der Spur muss ich eine Datei in das Home-Verzeichnis des Benutzers verschieben.

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

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

Wie kann ich das Home-Verzeichnis des Benutzers dafür bekommen?

Quintin Par
quelle

Antworten:

11

Hm, ich denke da brauchst du ein Facter Modul um das zu tun und eine kleine hacky Manifest Datei ...

facter-Modul: Hiermit werden facter-Variablen für alle Benutzer registriert. wie "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 Manifest-Datei 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 nicht.

jfried
quelle
Können Sie mir eine Anleitung geben, wo diese Manifeste abgelegt werden sollen? Ich habe meine Grundklasse in init.pp und wohin gehe ich von dort aus?
Quintin Par
1
@QuintinPar Ich habe gerade damit begonnen, einige Puppenbeispiele oder Best Practices auf Github hochzuladen. Sie finden dieses Beispiel (facter class) hier: github.com/drandor/puppet-examples/tree/master/modules/user Sie müssen Pluginsync auf Ihrem Master und Ihrem Agenten aktiviert haben. Der zweite Code kann überall in Ihren * .pp-Dateien verwendet werden. Die Puppenkonfiguration und Knotenmanifeste (mit Stufen) finden Sie hier: github.com/drandor/puppet-config
Knotenmanifeste
1
Wenn der Benutzer noch nicht auf dem Computer vorhanden ist (ein neuer Benutzer wird hinzugefügt), ist das Faktum home_user nicht verfügbar. Das Erstellen neuer Benutzer erfordert möglicherweise zwei Puppet-Läufe. Bei der ersten Ausführung ist $ home_path leer, was zu unerwünschten Ergebnissen führen kann.
Mikko
3

Ich habe versucht, eine Lösung für genau dasselbe Problem zu finden, und es stellte sich heraus, dass es am besten ist, einen etwas anderen Ansatz zu wählen.

Definieren Sie das Basisverzeichnis explizit, zum Beispiel:

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

Wenn managehomefalse ist, wird nicht einmal das Basisverzeichnis erstellt. Sie müssen es also spezifisch definieren. Es ist oft am besten, eine benutzerdefinierte Definition für den gesamten Benutzer zu erstellen:

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 definieren $home = "/home"(betriebssystemspezifisch, falls erforderlich) und das Home-Verzeichnis mit verwenden "${home}/${username}".

Bearbeiten: Verwenden von Hash, um benutzerspezifische Basisverzeichnisse zu definieren

Neuere Puppet-Versionen (> = 2.6) unterstützen Hashes. Es wäre möglich, einen Hash-Inhalt zu definierenusername => /path/to/home Zuordnungen für jeden Benutzer :

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

Für jeden Benutzernamen ist es dann einfach, das Home-Verzeichnis mit zu bekommen $home['username'].

Home-Verzeichnis-Hash mit Fallback

In den meisten Fällen ist es am besten, einen "Fallback-Standard" zu verwenden, wenn der Benutzer im Hash nicht vorhanden ist. Theoretisch ist dies möglich, obwohl die Syntax ein wenig kryptisch und aufgedunsen ist:

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

user {$username:
    home => has_key($home, $username) ? {
                true => $home[$username], 
                false => "${default_home}/${username}" 
            }
    # ...
}
Mikko
quelle
2
Dies funktioniert nicht, wenn / home nicht die Standardeinstellung ist. say / var / lib / psql
Quintin Par
@Barry: Hast du den Rest der Antwort "Benutzerspezifische Home-Verzeichnisse" gelesen? (Die Antwort wurde nach dem Kommentar von Quintin Par bearbeitet)
Mikko
@Mikko Yeap, und ich habe versucht, die richtige (akzeptierte) Antwort zu bewerten. Es war verschlossen.
0

Diese Frage ist alt, aber immer noch relevant. Es gibt tatsächlich einen besseren Weg. Fügen Sie [module] /lib/facter/home_dirs.rb einen benutzerdefinierten Fakt hinzu , der Folgendes enthält:

require 'etc'

Facter.add(:home_dirs) do
  setcode do

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

    home_dirs

  end
end

Dann können Sie auf folgende Weise auf die Daten im Manifest zugreifen:

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

Denken Sie daran, dass dies nur funktioniert, wenn der Benutzer bereits vor dem Puppenspiel existiert. Wenn der Benutzer während des Laufs erstellt wird, sollte das Basisverzeichnis bereits bekannt oder zumindest vorhersehbar sein. Puppet soll schließlich Ordnung schaffen.

Hoffe das hilft jemandem.

C. Taylor
quelle