कक्षा नहीं मिली, और फिर भी यह वहां है


31

एक कर जब puppet agentएक नई छवि से कॉल, मैं एक हो रही है err: Could not find class custommodत्रुटि। मॉड्यूल स्वयं /etc/puppet/modules/custommodही अन्य सभी मॉड्यूल के समान है, जिसे हम कॉल कर रहे हैं, लेकिन यह एक ऑब्स्टिनटेंट है।

[Site.pp]

node /clunod-wk\d+\.sub\.example\.local/ {
      include base
      include curl
      include custommod
      class{ "custommod::apps": frontend => "false}
      [...]
}

जब कठपुतली निर्माता डिबग आउटपुट के साथ चलाया जाता है, तो यह स्पष्ट रूप से आधार और कर्ल के लिए जानकारी ढूंढ रहा है:

debug: importing '/etc/puppet/modules/base/manifests/init.pp' in environment production
debug: Automatically imported base from base into production
debug: importing '/etc/puppet/modules/curl/manifests/init.pp' in environment production
debug: Automatically imported curl from curl into production
err: Could not find class custommod for clunod-wk0130.sub.example.local at /etc/puppet/manifests/site.pp:84 on node clunod-wk0130.sub.example.local

लाइन 84 है include custommod

एक संक्षिप्त निर्देशिका और फ़ाइल संरचना:

/etc/puppet
   |- manifests
   |     |- site.pp
   |
   |- modules
         |- base
         |    |- manifests
         |          |- init.pp
         |
         |- curl
         |    |- manifests
         |          |- init.pp
         |   
         |- custommod
              |- files 
              |     |- apps
              |         |- [...]
              |
              |- manifests
                    |- init.pp
                    |- apps.pp

मैंने वर्तनी की जाँच की:}

init.ppकस्टममोड डायरेक्टरी की सामग्री पूरी तरह से अचूक है:

class custommod {
}

आशय apps.pp फ़ाइल के लिए एक खाली वर्ग बनाने का है, जो कि मांस है।

class custommod::apps {

    [lots of stuff]
}

केवल, यह ऐप्स फ़ाइल में कभी नहीं मिल रहा है। यदि मैं बाहर टिप्पणी करता हूं include custommod, तो इसके class{ "custommod::apps": frontend => "false}बजाय लाइन पर उपरोक्त त्रुटि उत्पन्न होती है ।

मैं यह जानने के लिए अपने शिकार में क्या याद कर रहा हूं कि यह त्रुटि कैसे उत्पन्न हो रही है? मुझे यह ध्यान देने की आवश्यकता है कि यह रेपो ठीक काम करता है अगर यह स्थानीय रूप से चलाया जाता है puppet apply


क्या आपने क्लाइंट yaml फ़ाइल में यह देखने के लिए कि आपकी कक्षा मौजूद है, में चोटी खींची?
ज़ॉडेचेस

@Zoredache / var / lib / कठपुतली / client_yaml / निर्देशिका क्लाइंट पर खाली है। क्लाइंट को एक could not retrieve catalog from remote server:त्रुटि मिल रही है जो शायद इसलिए है।
sysadmin1138

Hrm .. आपके मूल लेआउट और आयात संरचना को फिर से बनाया और मुद्दे को फिर से नहीं बना सका (2.7.1 पर)। खाली सहित रोकने के लिए सुरक्षित होना चाहिए custommod- शायद init.ppपूरी तरह से हटाने की भी कोशिश करें , क्योंकि इसकी आवश्यकता नहीं होनी चाहिए।
शेन झुंझलाना

@ShaneMadden मेरे द्वारा कोशिश करने के बाद, मेरा अगला कदम उस पर फेंकना है straceऔर यह पता लगाने का प्रयास करना है कि इस तरह से कौन सी फाइलें पढ़ने का प्रयास कर रहा है।
sysadmin1138

जवाबों:


32

तो ... यह थोड़ा शर्मनाक है, लेकिन ...

वातावरण।

मेरी /etc/puppet.confफाइल में यह है:

[master]
  manifest=$confdir/manifests/site.pp
  modulepath=$confdir/environments/$environment/modules:$confdir/modules

straceइसे फेंकने के बाद यह पता लगाने के लिए कि यह फाइलों के लिए कहां शिकार कर रहा था, मैंने कुछ देखा। यह के तहत custommod की तलाश में था /etc/puppet/environments/production/modules, और जब से वहाँ एक निर्देशिका थी (खाली), तब यह जाँच नहीं हुई/etc/puppet/modules । जाहिर तौर पर एक मॉड्यूल आयात करते समय यह फ़ाइल-उपस्थिति (init.pp) के बजाय निर्देशिका-उपस्थिति के लिए जांच करता है।

उस खाली निर्देशिका को हटा दें, चीजें काम करना शुरू कर देती हैं।

एक अलग वातावरण का उपयोग करके कठपुतली एजेंट चलाएं, चीजें काम करना शुरू कर देती हैं।

कहानी का नैतिक:

कठपुतली पर्यावरण पथ $ PATH की तरह काम नहीं करते हैं।


8
और अगर किसी ने कठपुतली.कान में स्पष्ट रूप से अपने मॉड्यूलपथ को परिभाषित नहीं किया है, और वे कठपुतली के मॉड्यूलपाथ को स्ट्रेस का सहारा लिए बिना ढूंढना चाहते हैं, तो वे भी चला सकते हैं puppet config print modulepath
एलिसन आर।

1
क्या यह पपेटलैब्स को सूचित किया गया है?
फेलिप अल्वारेज़

3
मॉड्यूलपैथ अब एक डिप्रेसेशन चेतावनी चलाता है।
मैगलन

4

मैं इस समस्या में भाग गया, लेकिन एक अलग तय था

यदि आप एक कठपुतली मॉड्यूल उत्पन्न करते हैं जैसे:

puppet module generate foo-example_module

यह नाम स्थान के example_moduleसाथ एक मॉड्यूल बनाएगा foo। सभी मेनिफ़ेस्ट एक निर्देशिका के अंदर होंगे, जिसे कहा जाता हैfoo-example_module

Init.pp में परिभाषित वर्ग का नाम फ़ोल्डर नाम के समान होना चाहिए।

सरल तय:

mv foo-example_module example_module

यदि आप कठपुतली-लिंट चलाते हैं, तो यह निम्नलिखित संदेश के साथ चेतावनी देगा:

ERROR: example_module not in autoload module layout on line 42

यदि r10k या लाइब्रेरियन-कठपुतली के साथ एक कठपुतली का उपयोग कर रहे हैं, तो आपको नाम स्थान को हटाने की भी आवश्यकता हो सकती है ताकि फ़ाइलों को आपके मॉड्यूल निर्देशिका में 'foo' उपसर्ग के बिना रखा जाए।

पहले:

mod 'foo-example_module',
    :git => git@github.com:foo/example_module'

बाद:

mod 'example_module',
    :git => git@github.com:foo/example_module'


0

फेडोरा के लिए कठपुतली 3.7.1 के साथ समान समस्या में भाग गया: my.server के लिए वर्ग कठपुतली नहीं मिली

समाधान:

sudo ln -s /my/local/copy/puppet/modules /etc/puppet/

तब यह काम करता है।


0

मुझे भी ऐसी ही समस्या का समाधान करना पड़ा था। मेरे मामले में कक्षा का नाम "onehost :: change_IoT_password_reminder" था। स्ट्रेस का उपयोग करने के बाद मैंने पाया कि कठपुतली एक मॉड्यूल / वनहोस्ट / मेनिफ़ेस्ट / चेंज_ओट_पासवर्ड_्रेमिंडर .pp फ़ाइल की तलाश में थी। ऐसा लगता है कि कक्षा के नामों में ऊपरी अक्षरों का उपयोग करना एक अच्छा विचार नहीं है, भले ही यह कक्षा का पहला अक्षर न हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.