Con rối: Nhận thư mục nhà của người dùng


12

Tôi đang tạo một người dùng như sau

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

Bây giờ bạn có thể thấy tôi đang thực hiện một quản lý là sai Bây giờ sau khi xuống làn, tôi cần đẩy một tập tin vào thư mục chính của người dùng.

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

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

Làm thế nào tôi có thể lấy thư mục nhà của người dùng cho việc này?

Câu trả lời:


11

Hừm, tôi nghĩ rằng bạn sẽ cần một modul facter để làm điều đó và một tập tin kê khai nhỏ ...

mô-đun facter: Điều này sẽ đăng ký biến facter cho tất cả người dùng. như "home_root" hoặc "home_apache".

require 'etc'

Etc.passwd { |user|

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

}

và sau đó bạn có thể sử dụng chúng trong tệp kê khai của bạn như thế này:

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

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

Có lẽ có một cách tốt hơn, nhưng tôi không sợ.


Bạn có thể cho tôi một số hướng dẫn về nơi để đặt bảng kê khai này? Tôi có lớp cơ bản của mình trong init.pp và tôi sẽ đi đâu từ đó?
Quintin Par

1
@QuintinPar Tôi mới bắt đầu tải lên một số ví dụ về con rối hoặc cách thực hành tốt nhất để github. bạn sẽ tìm thấy ví dụ này (lớp facter) tại đây: github.com/drandor/puppet-examples/tree/master/modules/user bạn cần kích hoạt pluginsync trên chủ và đại lý của bạn. mã thứ hai có thể được sử dụng ở bất cứ đâu trong tệp * .pp của bạn. Cấu hình con rối và bảng kê khai nút (có các giai đoạn) có thể được tìm thấy ở đây: github.com/drandor/puppet-config
jfried

1
Nếu người dùng chưa tồn tại trên máy (người dùng mới được thêm vào), thực tế home_user không khả dụng. Tạo người dùng mới có thể cần hai lần chạy rối. Trong lần chạy đầu tiên, $ home_path trống và điều này có thể dẫn đến kết quả không mong muốn.
Mikko

3

Tôi đã cố gắng tìm một giải pháp cho cùng một vấn đề, và hóa ra cách tốt nhất là thực hiện một cách tiếp cận hơi khác.

Xác định rõ ràng thư mục nhà, ví dụ:

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

Khi managehomesai, thư mục chính thậm chí không được tạo. Vì vậy, bạn phải xác định cụ thể nó. Thông thường tốt nhất là tạo một định nghĩa tùy chỉnh cho toàn bộ người dùng:

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

Bạn có thể thêm nhiều tham số, ví dụ $keyvalue, và tạo một keyfile nếu tham số đó được đưa ra.

Bạn cũng có thể xác định một biến toàn cục $home = "/home"(hệ điều hành cụ thể, nếu cần) và nhận thư mục về nhà với "${home}/${username}".

Chỉnh sửa: Sử dụng hàm băm để xác định thư mục nhà cụ thể của người dùng

Các phiên bản Puppet gần đây (> = 2.6) hỗ trợ băm. Có thể xác định hàm băm chứa username => /path/to/homeánh xạ cho mỗi người dùng:

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

Đối với bất kỳ tên người dùng, sau đó dễ dàng để có được thư mục nhà với $home['username'].

Thư mục chính băm với dự phòng

Hầu hết thời gian, tốt nhất là có "mặc định dự phòng" nếu người dùng không tồn tại trong hàm băm. Về lý thuyết, điều này là có thể, mặc dù cú pháp trở nên hơi khó hiểu và cồng kềnh:

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

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

2
Điều này không hoạt động khi / nhà không phải là mặc định. nói / var / lib / psql
Quintin Par

@Barry: Bạn đã đọc phần còn lại của câu trả lời, "thư mục nhà dành riêng cho người dùng"? (Câu trả lời đã được chỉnh sửa sau khi nhận xét của Quintin Par)
Mikko

@Mikko Yeap, và tôi đã cố gắng đưa ra câu trả lời đúng (được chấp nhận). Nó đã bị khóa.

0

Câu hỏi này đã cũ, nhưng vẫn còn liên quan. Thực tế có một cách tốt hơn bây giờ. Thêm một thực tế tùy chỉnh vào [mô-đun] /lib/facter/home_dirs.rb có chứa những điều sau đây:

require 'etc'

Facter.add(:home_dirs) do
  setcode do

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

    home_dirs

  end
end

Sau đó, bạn có thể truy cập dữ liệu trong bảng kê khai:

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

Hãy nhớ rằng điều này chỉ hoạt động nếu người dùng đã tồn tại trước khi chạy rối. Nếu người dùng được tạo trong quá trình chạy, thư mục chính sẽ được biết đến hoặc ít nhất là có thể dự đoán được. Rối được thiết kế để tạo ra trật tự, sau khi tất cả.

Hy vọng điều này sẽ giúp được ai đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.