2012-10-12 9 views
10

में फ़ाइल बनाने मैं एक फ़ाइल संसाधनमहाराज उपयोगकर्ता के घर निर्देशिका

file "somefile" do 
    action :create_if_missing 
    end 

बनाने के लिए महाराज उपयोग कर रहा हूँ और मैं उपयोगकर्ता के घर निर्देशिका में इस रखना चाहते हैं। मैं दो मुद्दों कर रहा हूँ:

  1. फ़ाइल/के सापेक्ष व्याख्या की है, इसलिए का उपयोग कर ~/समाप्त होता है में फ़ाइल डाल/~/
  2. मैं आवारा के माध्यम से इस महाराज नुस्खा की शुरूआत कर रहा हूँ और इन फ़ाइलों किया जा रहा है रूट द्वारा बनाया गया। तो अगर मैं काम करने के लिए ~/प्राप्त कर सकता हूं, तो यह रूट के घर में खत्म हो जाएगा। मैं उपयोगकर्ता नाम वारंटी का उपयोग करने के लिए कड़ी कोड नहीं चाहता क्योंकि यह हमेशा ऐसा नहीं होगा (हम इन्हें शेफ क्लाइंट के साथ भी चला सकते हैं), और node[:user] खाली प्रतीत होता है।

क्या गैर-रूट उपयोगकर्ता (इस मामले में वारंटी) में एक निर्देशिका बनाने का कोई तरीका है?

उत्तर

2

ऐसा इसलिए है क्योंकि शेफ व्यंजन root उपयोगकर्ता द्वारा चलाए जाते हैं। इस वर्कअराउंड के बारे में

if File.exists? "/vagrant" 
    user = "vagrant" 
else 
    user = "deployer" 
end 

file "/home/#{user}/foo" do 
    .. 
end 
+0

मैं इस दृष्टिकोण से सहमत हैं, लेकिन मैं नोड गुण आप में डिफ़ॉल्ट पारित का प्रयोग करेंगे। [: Chef_client] [: उपयोगकर्ता नाम] – nictrix

+1

चूंकि यह योनि द्वारा चलाया नहीं जा सकता है, इसलिए मैं फ़ाइल में उस नाम को हार्ड कोड नहीं करना चाहता हूं। डिफ़ॉल्ट है [: chef_client] [: उपयोगकर्ता नाम] एक विशेषता है? या क्या कोई विशेषता है जिसका उपयोग मैं उपयोगकर्ता को प्राप्त करने के लिए कर सकता हूं? –

+2

ऐसा लगता है कि ENV ['PWD'] का उपयोग करने से मुझे कामकाजी निर्देशिका मिल जाएगी, जो वर्तमान उपयोगकर्ता का घर डीआईआर –

0

जैसा कि मैं शेफ अवधारणा को समझता हूं - प्रत्येक नुस्खा स्वयं निहित होना चाहिए। इसका मतलब है कि आप केवल एक नुस्खा (उनमें से कोई भी) को run_list में जोड़ने में सक्षम होना चाहिए और इसे खाली मशीन पर सफलतापूर्वक इंस्टॉल किया जाना चाहिए।

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

include_recipe 'user::my_user' 
my_user = data_bag_item('user', 'my_user') 

file ::File.join(my_user['home'], 'somefile') do 
    action :create_if_missing 
end 
18

थ्रेड पुराना है, लेकिन मुझे एक पल पहले इस समस्या का सामना करना पड़ा।

उदाहरण के लिए आप उपयोगकर्ता के लिए विशेषता बना सकते हैं: default['mycookbook']['user']

फिर अपने नुस्खा में

:

user = node['mycookbook']['user'] # user set in cookbook attrubute 
# user = node['current_user'] # user running chef cookbook (on provisioned host) 

home = node['etc']['passwd'][user]['dir'] # Chef DSL 
# home = Dir.home(user) # It's Ruby 

file "#{home}/somefile" do 
    action :create_if_missing 
end 
संबंधित मुद्दे