Puppet: รับไดเรกทอรีบ้านของผู้ใช้


13

ฉันกำลังสร้างผู้ใช้ดังต่อไปนี้

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

ทีนี้อย่างที่คุณเห็นฉันกำลังทำManagehome เป็นเท็จ ทีนี้ต่อมาฉันต้องผลักไฟล์ไปที่โฮมไดเร็กตอรี่ของผู้ใช้

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

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

ฉันจะรับโฮมไดเร็กตอรี่ของผู้ใช้ได้อย่างไร?

คำตอบ:


12

อืมฉันคิดว่าที่นั่นคุณจะต้องมีโมดูลแฟคเตอร์เพื่อทำสิ่งนั้นและไฟล์รายการแฮ็กเล็กน้อย

โมดูล facter: นี่จะลงทะเบียนตัวแปร facter สำหรับผู้ใช้ทั้งหมด เช่น "home_root" หรือ "home_apache"

require 'etc'

Etc.passwd { |user|

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

}

จากนั้นคุณสามารถใช้ไฟล์เหล่านี้ในไฟล์ Manifest ดังนี้

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

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

อาจจะมีวิธีที่ดีกว่า แต่ฉันก็ไม่กลัว


คุณสามารถให้คำแนะนำฉันเกี่ยวกับสถานที่ที่จะนำรายการนี้ได้หรือไม่ ฉันมีชั้นเรียนพื้นฐานใน init.pp และฉันจะไปจากที่นั่นได้อย่างไร
Quintin Par

1
@QuintinPar ฉันเพิ่งเริ่มอัปโหลดตัวอย่างหุ่นเชิดหรือแนวปฏิบัติที่ดีที่สุดไปยัง GitHub คุณจะพบตัวอย่างนี้ (คลาส facter) ที่นี่: github.com/drandor/puppet-examples/tree/master/modules/userคุณต้องเปิดใช้งานปลั๊กอินในต้นแบบและตัวแทนของคุณ รหัสที่สองสามารถใช้ได้ทุกที่ในไฟล์ * .pp ของคุณ การกำหนดค่าหุ่นกระบอกและโหนดปรากฏ (พร้อมสเตจ) สามารถดูได้ที่นี่: github.com/drandor/puppet-config
jfried

1
หากผู้ใช้ยังไม่มีอยู่บนเครื่อง (เพิ่มผู้ใช้ใหม่) ข้อเท็จจริง home_user จะไม่สามารถใช้ได้ การสร้างผู้ใช้ใหม่อาจต้องใช้ Puppet สองตัว ในการเรียกใช้ครั้งแรก $ home_path ว่างเปล่าและสิ่งนี้อาจนำไปสู่ผลลัพธ์ที่ไม่ต้องการ
Mikko

4

ฉันพยายามหาวิธีแก้ไขปัญหาเดียวกันและกลับกลายเป็นว่าวิธีที่ดีที่สุดคือใช้แนวทางที่ต่างออกไปเล็กน้อย

กำหนดโฮมไดเร็กทอรีอย่างชัดเจนตัวอย่างเช่น:

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

เมื่อmanagehomeเป็นเท็จไดเรกทอรีบ้านไม่ได้ถูกสร้างขึ้น ดังนั้นคุณต้องกำหนดเป็นพิเศษ เป็นการดีที่สุดที่จะสร้างคำจำกัดความที่กำหนดเองสำหรับผู้ใช้ทั้งหมด:

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

คุณสามารถเพิ่มพารามิเตอร์เพิ่มเติมตัวอย่างเช่น$keyvalueและสร้าง keyfile หากกำหนดพารามิเตอร์นั้น

นอกจากนี้คุณยังสามารถกำหนดตัวแปรทั่วโลก$home = "/home"(OS เฉพาะถ้าจำเป็น) และได้รับ dir "${home}/${username}"บ้านด้วย

แก้ไข: การใช้แฮชเพื่อกำหนดโฮมไดเรกทอรีเฉพาะของผู้ใช้

การสนับสนุนรุ่นหุ่นกระบอก (> = 2.6) ล่าสุด เป็นไปได้ที่จะกำหนดแฮชที่มีusername => /path/to/homeการแมปสำหรับผู้ใช้แต่ละคน:

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

ชื่อผู้ใช้ใด ๆ $home['username']ก็เป็นแล้วง่ายที่จะได้รับไดเรกทอรีบ้านด้วย

แฮชไดเรกทอรีบ้านที่มีทางเลือก

ส่วนใหญ่จะเป็นการดีที่สุดที่จะมี "ค่าเริ่มต้นสำรอง" หากผู้ใช้ไม่มีอยู่ในแฮช ในทางทฤษฎีสิ่งนี้เป็นไปได้แม้ว่าไวยากรณ์จะกลายเป็นความลับและป่องเล็กน้อย:

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

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

2
สิ่งนี้ทำงานได้เมื่อ / home ไม่ใช่ค่าเริ่มต้น พูด / var / lib / psql
Quintin Par

@Barry: คุณอ่านคำตอบที่เหลือ "ไดเรกทอรีเฉพาะผู้ใช้" หรือไม่? (คำตอบถูกแก้ไขหลังจากความคิดเห็นโดย Quintin Par)
Mikko

@ Mikko Yeap และฉันพยายาม upvote คำตอบที่ถูกต้อง (ยอมรับ) มันถูกล็อค

1

คำถามนี้เก่า แต่ก็ยังมีความเกี่ยวข้อง ในความเป็นจริงมีวิธีที่ดีกว่าตอนนี้ เพิ่มข้อเท็จจริงที่กำหนดเองไปที่[module] /lib/facter/home_dirs.rbมีสิ่งต่อไปนี้:

require 'etc'

Facter.add(:home_dirs) do
  setcode do

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

    home_dirs

  end
end

จากนั้นคุณสามารถเข้าถึงข้อมูลในรายการได้ดังนี้:

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

โปรดจำไว้ว่าวิธีนี้จะใช้งานได้หากผู้ใช้มีอยู่แล้วก่อนที่หุ่นจะวิ่ง หากผู้ใช้กำลังถูกสร้างขึ้นในระหว่างการเรียกใช้ไดเรกทอรีบ้านควรเป็นที่รู้จักอยู่แล้วหรืออย่างน้อยก็คาดเดาได้ หุ่นถูกออกแบบมาเพื่อสร้างคำสั่งหลังจากทั้งหมด

หวังว่านี่จะช่วยใครซักคน


0

เมื่อโมดูลบัญชีพร้อมใช้งานและบัญชีทั้งหมดถูกสร้างขึ้นผ่าน hiera จากนั้นบล็อกด้านล่างจะสร้างไฟล์ในโฮมไดเร็กตอรี่ของผู้ใช้แต่ละรายโดยสมมติว่าคุณไม่สนใจบัญชีผู้ใช้ระบบนอกเหนือจากรูท

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_dirควรถูกต้องสำหรับผู้ใช้ทั้งหมดที่มี

  1. การจัดการกับaccounts,
  2. มั่นใจได้ว่าเป็น present
  3. สำหรับhomeไดเรกทอรีที่ไม่ได้มาตรฐาน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.