Puppet: Pobierz katalog domowy użytkowników

13

Tworzę użytkownika w następujący sposób

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

Teraz, jak widać, robię zarządzanie domem jest fałsz. Później w dół linii muszę wypchnąć plik do katalogu domowego użytkownika.

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

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

Jak mogę uzyskać do tego katalog domowy użytkownika ?

Quintin Par
źródło

Odpowiedzi:

12

Hm, myślę, że potrzebujesz modułu modulującego, aby to zrobić i trochę zhackowanego pliku manifestu ...

moduł faktora: zarejestruje zmienne faktora dla wszystkich użytkowników. jak „home_root” lub „home_apache”.

require 'etc'

Etc.passwd { |user|

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

}

a następnie możesz użyć ich w pliku manifestu w następujący sposób:

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

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

Być może istnieje lepszy sposób, ale obawiam się, że nie.

jfried
źródło
Czy możesz mi podać wskazówki, gdzie umieścić te manifesty? Mam swoją podstawową klasę w init.pp i dokąd mam się udać?
Quintin Par
1
@QuintinPar Właśnie zacząłem przesyłać przykłady marionetek lub najlepsze praktyki do github. ten przykład (klasa facter) znajdziesz tutaj: github.com/drandor/puppet-examples/tree/master/modules/user , musisz mieć pluginsync aktywowany na swoim komputerze głównym i agencie. drugiego kodu można użyć w dowolnym miejscu w plikach * .pp. Konfiguracja marionetek i manifesty węzłów (z etapami) można znaleźć tutaj: github.com/drandor/puppet-config
jfried
1
Jeśli użytkownik jeszcze nie istnieje na komputerze (nowy użytkownik zostanie dodany), fakt użytkownik domowy nie jest dostępny. Tworzenie nowych użytkowników może wymagać dwóch uruchomień Puppet. Przy pierwszym uruchomieniu $ home_path jest pusta, co może prowadzić do niepożądanych wyników.
Mikko,
4

Próbowałem znaleźć rozwiązanie dla dokładnie tego samego problemu i okazało się, że najlepiej jest zastosować nieco inne podejście.

Zdefiniuj katalog domowy jawnie, na przykład:

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

Kiedy managehomema wartość false, katalog domowy nawet nie jest tworzony. Więc musisz to szczegółowo zdefiniować. Często najlepiej jest stworzyć niestandardową definicję dla całego użytkownika:

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

Możesz na przykład dodać więcej parametrów $keyvaluei utworzyć plik klucza, jeśli ten parametr zostanie podany.

Możesz także zdefiniować zmienną globalną $home = "/home"(w razie potrzeby specyficzną dla systemu operacyjnego) i uzyskać katalog domowy za pomocą "${home}/${username}".

Edycja: Używanie skrótu do definiowania katalogów domowych specyficznych dla użytkownika

Nowsze wersje Puppet (> = 2.6) obsługują skróty. Możliwe byłoby zdefiniowanie skrótu zawierającego username => /path/to/homemapowania dla każdego użytkownika:

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

W przypadku dowolnej nazwy użytkownika łatwo jest uzyskać katalog domowy $home['username'].

Skrót katalogu domowego z rezerwowym

Przez większość czasu najlepiej byłoby mieć „domyślne ustawienie rezerwowe”, jeśli użytkownik nie istnieje w haszowaniu. Teoretycznie jest to możliwe, chociaż składnia staje się nieco tajemnicza i rozdęta:

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

user {$username:
    home => has_key($home, $username) ? {
                true => $home[$username], 
                false => "${default_home}/${username}" 
            }
    # ...
}
Mikko
źródło
2
Działa to tylko wtedy, gdy / home nie jest ustawieniem domyślnym. say / var / lib / psql
Quintin Par
@ Barry: Czy przeczytałeś resztę odpowiedzi „katalogi domowe właściwe dla użytkownika”? (Odpowiedź została zredagowana po komentarzu Quintin Par)
Mikko,
@Mikko Yeap, i próbowałem głosować poprawną (zaakceptowaną) odpowiedź. To było zamknięte.
1

To pytanie jest stare, ale wciąż aktualne. W rzeczywistości jest teraz lepszy sposób. Dodaj niestandardowy fakt do [module] /lib/facter/home_dirs.rb zawierający następujące elementy:

require 'etc'

Facter.add(:home_dirs) do
  setcode do

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

    home_dirs

  end
end

Następnie możesz uzyskać dostęp do danych w manifeście w następujący sposób:

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

Pamiętaj, że działa to tylko wtedy, gdy użytkownik już istnieje przed uruchomieniem marionetek. Jeśli użytkownik jest tworzony podczas uruchamiania, katalog domowy powinien być już znany lub przynajmniej przewidywalny. W końcu Puppet ma na celu stworzenie porządku.

Mam nadzieję, że to komuś pomoże.

C. Taylor
źródło
0

Gdy moduł kont jest dostępny, a wszystkie konta są tworzone za pomocą hiera, wówczas poniższy blok tworzy plik w katalogu domowym każdego użytkownika, zakładając, że nie obchodzą Cię konta użytkowników systemowych poza rootem.

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_dirPowinny być poprawne dla wszystkich użytkowników, które są

  1. udało się accounts,
  2. są zapewnione present
  3. dla niestandardowych homekatalogów.
Pokonaj Christena
źródło