ไม่สามารถหาชั้นเรียนและยังมี


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}
      [...]
}

เมื่อ puppetmaster รันด้วยเอาต์พุต debug มันจะค้นหาข้อมูลสำหรับฐานและขดอย่างชัดเจน:

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ในไดเร็กทอรี custommod นั้นไม่ได้ทำเครื่องหมายอย่างสมบูรณ์:

class custommod {
}

ความตั้งใจคือการสร้างคลาสที่ว่างเปล่าสำหรับไฟล์ apps.pp ซึ่งเป็นที่ที่เนื้อสัตว์อยู่

class custommod::apps {

    [lots of stuff]
}

อย่างเดียวไม่เคยไปที่ไฟล์แอพ หากฉันใส่ความคิดเห็นinclude custommodผิดพลาดข้อผิดพลาดด้านบนจะถูกสร้างขึ้นบนclass{ "custommod::apps": frontend => "false}บรรทัดแทน

ฉันขาดอะไรบ้างในการตามล่าเพื่อค้นหาว่าข้อผิดพลาดนี้ถูกสร้างขึ้นอย่างไร ฉันต้องการที่จะทราบว่า repo puppet applyนี้ทำงานได้ดีหากมีการทำงานเฉพาะทาง


คุณใช้จุดสูงสุดในไฟล์ yaml ของไคลเอ็นต์เพื่อดูว่ามีคลาสของคุณอยู่หรือไม่
Zoredache

@Zoredache ไดเร็กทอรี / var / lib / puppet / client_yaml / ว่างเปล่าบนไคลเอ็นต์ ลูกค้ากำลังได้รับcould not retrieve catalog from remote server:ข้อผิดพลาดซึ่งอาจเป็นสาเหตุ
sysadmin1138

Hrm .. สร้างโครงร่างพื้นฐานและโครงสร้างการนำเข้าของคุณใหม่และไม่สามารถสร้างปัญหาขึ้นใหม่ได้ (วันที่ 2.7.1) ควรจะปลอดภัยที่จะหยุดรวมถึงที่ว่างเปล่าcustommod- หรืออาจลองลบinit.ppไปพร้อม ๆ กันเพราะมันไม่จำเป็น
Shane Madden

@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)

ลบไดเรกทอรีที่ว่างเปล่าสิ่งต่าง ๆ เริ่มทำงาน

เรียกใช้ตัวแทนหุ่นเชิดโดยใช้สภาพแวดล้อมที่แตกต่างกันสิ่งต่าง ๆ เริ่มทำงาน

นิทานสอนใจ:

เส้นทางสภาพแวดล้อมของ Puppet ไม่ได้ทำตัวเหมือน bash $ PATH


8
และในกรณีที่มีคนยังไม่ได้กำหนด modulepath ของพวกเขาอย่างชัดเจนใน puppet.conf และพวกเขาต้องการที่จะหา modulepath หุ่นเชิดโดยไม่ต้องหันไป strace puppet config print modulepathพวกเขายังสามารถทำงานได้
อลิสันอา

1
นี้ถูกรายงานไปยังหุ่นกระบอกหรือไม่?
Felipe Alvarez

3
ตอนนี้โมดูลพาทริกเกอร์คำเตือนการเลิกใช้
Magellan

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

หากใช้ Puppetfile กับ r10k หรือ librarian-puppet คุณอาจต้องลบพื้นที่ชื่อเพื่อให้ไฟล์ถูกวางโดยไม่มีคำนำหน้า '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 สำหรับ Fedora: ไม่พบหุ่นเชิดสำหรับ my.server

วิธีการแก้:

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

จากนั้นก็ใช้งานได้


0

ฉันมีปัญหาที่คล้ายกัน ในกรณีของฉันชื่อคลาสคือ "onehost :: change_IoT_password_reminder" หลังจากใช้ strace ฉันพบว่า puppet กำลังมองหาไฟล์ modules / onehost / manifests / change_iot_password_reminder.pp ดูเหมือนว่าการใช้ตัวอักษรตัวพิมพ์ใหญ่ในชื่อคลาสไม่ใช่ความคิดที่ดีแม้ว่าจะไม่ใช่ตัวอักษรตัวแรกของคลาส

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