कठपुतली: उपयोगकर्ताओं को घर निर्देशिका प्राप्त करें


13

मैं अनुसरण के रूप में एक उपयोगकर्ता बना रहा हूं

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

अब जैसा कि आप देख सकते हैं कि मैं एक प्रबंधन कर रहा हूं वह गलत है अब बाद में लेन के नीचे मुझे उपयोगकर्ता की होम निर्देशिका में एक फ़ाइल को धकेलने की आवश्यकता है।

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

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

मैं इसके लिए उपयोगकर्ता की होम निर्देशिका कैसे प्राप्त कर सकता हूं ?

जवाबों:


12

हम्म, मुझे लगता है कि आपको ऐसा करने के लिए एक फैक्टर मोडुल की आवश्यकता होगी और एक छोटी सी हैकी मैनिफ़ेस्ट फ़ाइल ...

फैक्टर मॉड्यूल: यह सभी उपयोगकर्ताओं के लिए फैक्टर चर को पंजीकृत करेगा। जैसे "home_root" या "home_apache"।

require 'etc'

Etc.passwd { |user|

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

}

और फिर आप उन्हें अपनी मैनिफ़ेस्ट फ़ाइल के अंदर इस तरह उपयोग कर सकते हैं:

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

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

शायद एक बेहतर तरीका है, लेकिन मुझे डर नहीं है।


क्या आप मुझे इस बारे में कुछ मार्गदर्शन दे सकते हैं कि यह मैनिफ़ेस्ट कहाँ रखा जाए? मेरे पास init.pp में मेरा मूल वर्ग है और मैं वहां से कहां जाता हूं?
क्विंटन Par

1
@QuintinPar मैंने अभी कुछ कठपुतली उदाहरणों या सर्वोत्तम प्रथाओं को जीथब पर अपलोड करना शुरू किया है। आपको यह उदाहरण (फैक्टर क्लास) यहाँ मिलेगा: github.com/drandor/puppet-examples/tree/master/modules/user आपके पास अपने मास्टर और अपने एजेंट पर प्लग इन सक्रिय होने की आवश्यकता है। दूसरा कोड आपके * .pp फ़ाइलों में कहीं भी उपयोग किया जा सकता है। कठपुतली विन्यास और नोड मैनिफ़ेस्ट (चरणों के साथ) यहाँ
देखे

1
यदि उपयोगकर्ता अभी तक मशीन पर मौजूद नहीं है (नया उपयोगकर्ता जोड़ा गया है), home_user तथ्य उपलब्ध नहीं है। नए उपयोगकर्ता बनाने के लिए दो कठपुतली रन की आवश्यकता हो सकती है। पहले रन पर, $ home_path खाली है, और इससे अवांछित परिणाम हो सकते हैं।
मिकको

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, और यदि वह पैरामीटर दिया जाता है तो एक कीफाइल बनाएं।

आप एक वैश्विक चर $home = "/home"(ओएस विशिष्ट, यदि आवश्यक हो) को परिभाषित कर सकते हैं और घर के साथ प्राप्त कर सकते हैं "${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
यह तब काम करता है जब / घर डिफ़ॉल्ट न हो। / var / lib / psql
क्विंटन Par

@Barry: क्या आपने बाकी जवाब, "उपयोगकर्ता-विशिष्ट घर निर्देशिकाओं" को पढ़ा है? (क्विंटिन पार की टिप्पणी के बाद जवाब संपादित किया गया था)
मिको ४

@ मिक्को येप, और मैंने सही (स्वीकृत) उत्तर को ऊपर उठाने की कोशिश की। ताला पड़ा हुआ था।

1

यह प्रश्न पुराना है, लेकिन अभी भी प्रासंगिक है। वास्तव में अब एक बेहतर तरीका है। एक कस्टम तथ्य [मॉड्यूल] /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निर्देशिकाओं के लिए।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.