Puppet: ottieni la home directory degli utenti


12

Sto creando un utente come segue

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

Ora, come puoi vedere, sto facendo un managehome è falso. Ora più avanti ho bisogno di spingere un file nella home directory dell'utente.

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

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

Come posso ottenere la home directory dell'utente per questo?

Risposte:


11

Hm, penso che ti serva un modulo facter per farlo e un piccolo file manifest ...

modulo facter: registrerà le variabili facter per tutti gli utenti. come "home_root" o "home_apache".

require 'etc'

Etc.passwd { |user|

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

}

e quindi puoi usarli all'interno del tuo file manifest in questo modo:

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

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

Forse c'è un modo migliore, ma temo di no.


Puoi darmi qualche consiglio su dove mettere questo manifest? Ho la mia classe di base in init.pp e dove posso andare da lì?
Quintin Par

1
@QuintinPar ho appena iniziato a caricare alcuni esempi di marionette o best practice su github. troverai questo esempio (facter class) qui: github.com/drandor/puppet-examples/tree/master/modules/user devi attivare pluginsync sul tuo master e sul tuo agente. il secondo codice può essere utilizzato ovunque nei file * .pp. La configurazione dei pupazzi e i manifesti dei nodi (con fasi) sono disponibili qui: github.com/drandor/puppet-config
jfried

1
Se l'utente non esiste ancora sulla macchina (viene aggiunto un nuovo utente), l'home_user non è disponibile. La creazione di nuovi utenti potrebbe richiedere due esecuzioni di marionette. Al primo avvio, $ home_path è vuoto e questo potrebbe portare a risultati indesiderati.
Mikko,

3

Ho cercato di trovare una soluzione per lo stesso identico problema e alla fine è stato meglio adottare un approccio leggermente diverso.

Definire esplicitamente la home directory, ad esempio:

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

Quando managehomeè falso, la home directory non viene nemmeno creata. Quindi devi definirlo in modo specifico. Spesso è meglio fare una definizione personalizzata per l'intero utente:

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

È possibile aggiungere più parametri, ad esempio $keyvalue, e creare un file di chiavi se viene fornito quel parametro.

Puoi anche definire una variabile globale $home = "/home"(specifica del sistema operativo, se necessario) e ottenere home directory con "${home}/${username}".

Modifica: utilizzo dell'hash per definire home directory specifiche dell'utente

Le versioni più recenti di Puppet (> = 2.6) supportano gli hash. Sarebbe possibile definire un hash contenente username => /path/to/homemappature per ciascun utente:

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

Per qualsiasi nome utente, è quindi facile ottenere home directory con $home['username'].

Hash della directory home con fallback

Il più delle volte, sarebbe meglio avere un "default di fallback" se l'utente non esiste nell'hash. In teoria questo è possibile, sebbene la sintassi diventi un po 'criptica e gonfia:

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

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

2
Questo non funziona quando / home non è l'impostazione predefinita. dire / var / lib / psql
Quintin Par

@ Barry: hai letto il resto della risposta "home directory specifiche dell'utente"? (La risposta è stata modificata dopo il commento di Quintin Par)
Mikko,

@Mikko Yeap, e ho provato a votare la risposta corretta (accettata). Era chiuso a chiave.

0

Questa domanda è vecchia, ma ancora pertinente. In effetti adesso c'è un modo migliore. Aggiungi un fatto personalizzato a [module] /lib/facter/home_dirs.rb contenente quanto segue:

require 'etc'

Facter.add(:home_dirs) do
  setcode do

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

    home_dirs

  end
end

Quindi puoi accedere ai dati nel manifest in questo modo:

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

Tieni presente che questo funziona solo se l'utente esiste già prima dell'esecuzione delle marionette. Se l'utente viene creato durante l'esecuzione, la home directory dovrebbe essere già nota o almeno prevedibile. Dopotutto Puppet è progettato per creare ordine.

Spero che questo aiuti qualcuno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.