Wayang: Dapatkan direktori home pengguna

12

Saya membuat pengguna sebagai berikut

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

Sekarang seperti yang Anda lihat saya lakukan adalah mengelola rumah palsu. Sekarang kemudian di jalan saya harus mendorong file ke direktori home pengguna.

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

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

Bagaimana saya bisa mendapatkan direktori home pengguna untuk ini?

Quintin Par
sumber

Jawaban:

11

Hm, saya pikir di sana Anda akan memerlukan modul facter untuk melakukan itu dan sedikit file manifes ...

modul facter: Ini akan mendaftarkan variabel facter untuk semua pengguna. seperti "home_root" atau "home_apache".

require 'etc'

Etc.passwd { |user|

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

}

dan kemudian Anda dapat menggunakannya di dalam file manifes Anda seperti ini:

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

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

Mungkin ada cara yang lebih baik, tapi saya rasa tidak.

jfried
sumber
Bisakah Anda memberi saya panduan tentang di mana harus meletakkan manifes ini? Saya memiliki kelas dasar di init.pp dan ke mana saya harus pergi?
Quintin Par
1
@QuintinPar saya baru saja mulai mengunggah beberapa contoh boneka atau praktik terbaik ke github. Anda akan menemukan contoh ini (kelas facter) di sini: github.com/drandor/puppet-examples/tree/master/modules/user Anda perlu mengaktifkan pluginsync pada master dan agen Anda. kode kedua dapat digunakan di mana saja di file * .pp Anda. Konfigurasi wayang dan simpul manifes (dengan tahapan) dapat ditemukan di sini: github.com/drandor/puppet-config
jfried
1
Jika pengguna belum ada di mesin (pengguna baru ditambahkan), fakta home_user tidak tersedia. Membuat pengguna baru mungkin membutuhkan dua proses wayang. Pada proses pertama, $ home_path kosong, dan ini dapat menyebabkan hasil yang tidak diinginkan.
Mikko
3

Saya mencoba mencari solusi untuk masalah yang persis sama, dan ternyata yang terbaik adalah mengambil pendekatan yang sedikit berbeda.

Tetapkan direktori home secara eksplisit, misalnya:

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

Ketika managehomesalah, direktori home bahkan tidak dibuat. Jadi, Anda harus mendefinisikannya secara spesifik. Seringkali yang terbaik untuk membuat definisi khusus untuk seluruh pengguna:

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

Anda dapat menambahkan lebih banyak parameter, misalnya $keyvalue, dan membuat keyfile jika parameter itu diberikan.

Anda juga dapat menentukan variabel global $home = "/home"(spesifik OS, jika perlu) dan mendapatkan dir home "${home}/${username}".

Sunting: Menggunakan hash untuk mendefinisikan direktori home khusus pengguna

Versi boneka terbaru (> = 2.6) mendukung hash. Dimungkinkan untuk mendefinisikan username => /path/to/homepemetaan yang berisi hash untuk setiap pengguna:

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

Untuk setiap nama pengguna, mudah untuk mendapatkan direktori home $home['username'].

Direktori rumah hash dengan fallback

Sebagian besar waktu, akan lebih baik untuk memiliki "fallback default" jika pengguna tidak ada di hash. Secara teori ini mungkin, meskipun sintaks menjadi sedikit samar dan membengkak:

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

user {$username:
    home => has_key($home, $username) ? {
                true => $home[$username], 
                false => "${default_home}/${username}" 
            }
    # ...
}
Mikko
sumber
2
Ini tidak berfungsi ketika / home bukan default. katakan / var / lib / psql
Quintin Par
@ Larry: Apakah Anda membaca sisa jawabannya, "direktori home khusus pengguna"? (Jawabannya diedit setelah komentar oleh Quintin Par)
Mikko
@Mikko Yeap, dan saya mencoba untuk memilih jawaban yang benar (diterima). Terkunci.
0

Pertanyaan ini sudah lama, tetapi masih relevan. Sebenarnya ada cara yang lebih baik sekarang. Tambahkan fakta khusus ke [module] /lib/facter/home_dirs.rb yang berisi yang berikut:

require 'etc'

Facter.add(:home_dirs) do
  setcode do

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

    home_dirs

  end
end

Maka Anda dapat mengakses data dalam manifes dengan demikian:

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

Ingatlah bahwa ini hanya berfungsi jika pengguna sudah ada sebelum boneka berjalan. Jika pengguna dibuat selama menjalankan, direktori home harus sudah diketahui atau setidaknya dapat diprediksi. Bagaimanapun, wayang dirancang untuk menciptakan keteraturan.

Semoga ini bisa membantu seseorang.

C. Taylor
sumber