2016-04-26 6 views
6

के साथ एकाधिक फ़ाइलों को कैसे इंस्टॉल करें मुझे निर्देशिका में कई फ़ाइलों को स्थापित करने की आवश्यकता है, जो स्वयं कठपुतली-प्रबंधित नहीं है। प्रत्येक फ़ाइल का source मेरे मॉड्यूल की files/ उपनिर्देशिका के अंतर्गत है।एक फ़ाइल-संसाधन

मैं उन्हें एक ही बार में इंस्टॉल करना चाहता हूं, क्योंकि उनके स्वामित्व और अनुमतियां समान हैं। लेकिन मैं source के लिए क्या डालूं? मुझे उम्मीद थी, बस निर्देशिका काम करेगा निर्दिष्ट करने:

file {[ 
    "${rcdir}/foo", "${rcdir}/bar", 
    ]: 
    source => "puppet:///${module_name}/", 
    group => 'wheel', 
    owner => 'root', 
    mode => '0644' 
    } 

लेकिन, दुर्भाग्य से, कठपुतली (3.7.5 का उपयोग कर यहाँ) बहुत चालाक स्वचालित रूप से foo और bar उचित रूप से संलग्न करने के लिए नहीं है।

क्या ऐसा करने का कोई अच्छा तरीका है, या क्या मुझे प्रत्येक फ़ाइल को दर्दनाक रूप से समझना है? धन्यवाद!

उत्तर

7

प्रत्येक के लिए फायदे और नुकसान के साथ, आप यहां क्या कर रहे हैं, हासिल करने के लिए कई तकनीकें हैं।

पहला, और सबसे स्पष्ट, जो आपको प्रत्येक फ़ाइल को स्वतंत्र रूप से कॉन्फ़िगर करने की क्षमता देता है और साथ ही साथ आप जिन फ़ाइलों को प्रबंधित कर रहे हैं उसकी पूरी सूची देखते हैं, प्रत्येक फ़ाइल को स्वतंत्र रूप से परिभाषित करना है। कोड डुप्लिकेशन की मात्रा को कम करने के लिए, आप प्रकार डिफ़ॉल्ट का उपयोग कर सकते हैं (हालांकि यह हमेशा उपयुक्त नहीं है)। यह कुछ निम्न जैसा दिखता है:

File { 
    group => 'wheel', 
    owner => 'root', 
    mode => '0644', 
} 
file { "${rcdir}/foo": 
    source => "puppet:///modules/${module_name}/foo", 
} 
file { "${rcdir}/bar": 
    source => "puppet:///modules/${module_name}/bar", 
} 

यह स्पष्ट रूप से बहुत तेज़ी से बहुत कमजोर हो जाता है।

परिभाषित प्रकार का उपयोग करने के लिए एक दूसरी रणनीति होगी। यह कुछ ऐसा करने के लिए उपयोग करने के लिए एक भारी उपकरण है, लेकिन यह चाल करेगा। यह कुछ इस तरह दिखेगा:

define myclass::file_array (
    $dest_base, 
    $source_base, 
    $group = 'wheel', 
    $owner = 'root', 
    $mode = '0644', 
) { 
    file { "${dest_base}/${name}": 
    source => "${source_base}/${name}", 
    group => $group, 
    owner => $owner, 
    mode => $mode, 
    } 
} 
class myclass(){ 
    $files_to_manage = ['foo', 'bar', 'baz'] 
    myclass::file_array { $files_to_manage: 
    source_base => "puppet:///modules/${module_name}", 
    dest_base => $rcdir, 
    } 
} 

यह एक अपेक्षाकृत मनमाने ढंग से परिभाषित प्रकार में जोड़ने के लिए आप की आवश्यकता है और आप अन्य पैरामीटर के बहुत सारे जोड़ने के लिए सभी गुण कोर फाइल करने के लिए उपलब्ध के माध्यम से अगर आप पास करना चाहते हैं की आवश्यकता होती है समाप्त होता है टाइप करें, हालांकि आपकी स्थिति के लिए यह पर्याप्त होगा।

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

file { $rcdir: 
    ensure => directory, 
    recurse => true, 
    source => "puppet:///modules/${module_name}/rc_files", 
    owner => 'root', 
    group => 'wheel', 
    mode => '0644', 
} 
// module directory 'files/rc_files' is where foo and bar would exist 

मैं यकीन है कि पिछले एक अपने आदर्श समाधान है कि हूँ, और आप को मान्य करने के लिए कि कोई अतिरिक्त फ़ाइलों अंत इस तरह के पर्ज के रूप में फ़ाइल संसाधन (https://docs.puppet.com/puppet/latest/reference/type.html#file-attribute-recurse) के अन्य पहलुओं का उपयोग कर सकते अपने गंतव्य में ऊपर।

वहां अन्य तकनीकें हैं, लेकिन उम्मीद है कि इनमें से एक आपके लिए चाल करेगा।

+0

धन्यवाद, जोश, विस्तृत उत्तर के लिए और, हाँ, 'रिकर्सिव' वह है जो मैं ढूंढ रहा था, लेकिन '$ आरसीडीआईआर' यहां कठपुतली द्वारा प्रबंधित नहीं किया जाता है - न ही यह हो सकता है। यह '/ etc/rc.d/init.d' है और इसमें पहले से ही इस मॉड्यूल से संबंधित फाइलों का एक गुच्छा शामिल है। मैं एक विधि के साथ आने की कोशिश कर रहा हूं, कि अन्य मॉड्यूल भी उपयोग कर सकते हैं - एक डिजाइन पैटर्न, यदि आप करेंगे - और यह नहीं करेगा ... –

+0

@ मिखाइल टी।, कठपुतली के माध्यम से निर्देशिका का प्रबंधन करने की आवश्यकता नहीं है भीतर हर फाइल प्रबंधित है। –

+0

@ जॉन बोलिंगर, हाँ, लेकिन यह मेरी समस्या नहीं है। मैं नहीं चाहता * मेरा * मॉड्यूल इस निर्देशिका को प्रबंधित करने के लिए - क्योंकि * अन्य * मॉड्यूल ... –