Kukla: Kullanıcıların giriş dizinini al


13

Ben oluşturma kullanıcıyı aşağıdaki gibi

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

Şimdi u görebileceğiniz gibi bir managehome yanlış yapıyorum Şimdi şeritten sonra kullanıcının ana dizine bir dosya itmek gerekiyor.

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

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

Bunun için kullanıcının ana dizinini nasıl edinebilirim ?

Yanıtlar:


12

Hm, bence bunu yapmak için bir facter modülüne ve biraz hacky manifest dosyasına ihtiyacınız olacak ...

facter modülü: Bu, tüm kullanıcılar için facter değişkenlerini kaydedecektir. "home_root" veya "home_apache" gibi.

require 'etc'

Etc.passwd { |user|

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

}

ve sonra bunları manifest dosyanızın içinde şu şekilde kullanabilirsiniz:

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

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

Belki daha iyi bir yol var, ama korkmuyorum.


Bu tezahürleri nereye koyacağım konusunda bana rehberlik edebilir misiniz? Temel sınıfım init.pp'de var ve oradan nereye gideceğim?
Quintin Par

1
@QuintinPar github'a bazı kukla örnekleri veya en iyi uygulamaları yüklemeye başladım. bu örneği (facter sınıfı) burada bulabilirsiniz: github.com/drandor/puppet-examples/tree/master/modules/user master ve acentanızda pluginsync'i etkinleştirmeniz gerekir. ikinci kod * .pp dosyalarınızın herhangi bir yerinde kullanılabilir. Kukla yapılandırması ve düğüm tezahürleri (aşamalarla birlikte) burada bulunabilir: github.com/drandor/puppet-config
jfried

1
Kullanıcı henüz makinede mevcut değilse (yeni kullanıcı eklenir), home_user gerçeği kullanılamaz. Yeni kullanıcılar oluşturmak için iki Kukla çalışması gerekebilir. İlk çalıştırmada $ home_path boştur ve bu istenmeyen sonuçlara yol açabilir.
Mikko

4

Aynı soruna bir çözüm bulmaya çalıştım ve biraz farklı bir yaklaşım benimsemek en iyisi oldu.

Giriş dizinini açıkça tanımlayın, örneğin:

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

Ne zaman managehomeyanlıştır, ev dizini bile oluşturulmadı. Bu yüzden özellikle tanımlamanız gerekir. Tüm kullanıcı için özel bir tanım yapmak genellikle en iyisidir:

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

Örneğin daha fazla parametre ekleyebilir $keyvalueve bu parametre verilirse bir anahtar dosyası oluşturabilirsiniz.

Ayrıca global bir değişken tanımlayabilir $home = "/home"(gerekirse işletim sistemine özel) ve home dir ile birlikte alabilirsiniz "${home}/${username}".

Düzenleme: Kullanıcıya özel ana dizinleri tanımlamak için karma kullanma

Daha yeni Kukla sürümleri (> = 2.6) karmaları destekler. username => /path/to/homeHer kullanıcı için eşlemeler içeren bir karma tanımlamak mümkün olacaktır :

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

Herhangi bir kullanıcı adı için, ana dizini ile almak kolaydır $home['username'].

Geri dönüşlü giriş dizini karması

Çoğu zaman, kullanıcı karma içinde yoksa bir "düşme varsayılan" olması en iyisidir. Teoride bu, sözdizimi biraz şifreli ve şişkin hale gelmesine rağmen mümkündür:

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

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

2
/ Home varsayılan değilse bu çalışmaz. say / var / lib / psql
Quintin Par

@Barry: "Kullanıcıya özel ev dizinleri" yanıtının geri kalanını okudunuz mu? (Yanıt, Quintin Par tarafından yapılan yorumdan sonra düzenlendi)
Mikko

@Mikko Yeap, ve ben doğru (kabul edilmiş) cevabı onaylamaya çalıştım. Kilitliydi.

1

Bu soru eski, ama yine de alakalı. Aslında şimdi daha iyi bir yol var. [Module] /lib/facter/home_dirs.rb dosyasına aşağıdakileri içeren özel bir olgu ekleyin :

require 'etc'

Facter.add(:home_dirs) do
  setcode do

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

    home_dirs

  end
end

Ardından manifest'teki verilere bu şekilde erişebilirsiniz:

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

Bunun yalnızca kullanıcı kukla çalıştırmasından önce zaten mevcutsa işe yaradığını unutmayın. Kullanıcı çalışma sırasında oluşturuluyorsa, giriş dizini zaten bilinmeli veya en azından tahmin edilebilir olmalıdır. Kukla, sonuçta sipariş yaratmak için tasarlanmıştır.

Umarım bu birine yardımcı olur.


0

Ne zaman hesapları modülü mevcuttur ve tüm hesaplar Hiera yoluyla oluşturulur, ardından aşağıdaki blok sistemi kullanıcı root yanında hesapları hakkında umursamıyorsun varsayarak her kullanıcının ev dizininde bir dosya oluşturur.

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],
  }
}

Olan $user_home_dirtüm kullanıcılar için doğru olmalıdır

  1. ile başardı accounts,
  2. olması sağlanır present
  3. standart olmayan homedizinler için.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.