Tidak dapat menemukan kelas, namun itu ada di sana

31

Saat melakukan puppet agentpanggilan dari gambar baru, saya mendapatkan err: Could not find class custommodkesalahan. Modul itu sendiri /etc/puppet/modules/custommodsama dengan semua modul lain yang kami panggil, tapi yang ini obstinante.

[site.pp]

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

Ketika dalang dijalankan dengan debug output, itu jelas menemukan informasi untuk basis dan keriting:

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

Jalur 84 adalah include custommod

Direktori dan struktur file yang disingkat:

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

Saya memang memeriksa ejaan:}

Konten init.ppdalam direktori custommod benar-benar biasa-biasa saja:

class custommod {
}

Maksudnya adalah untuk membuat kelas kosong untuk file apps.pp, yang merupakan tempat daging.

class custommod::apps {

    [lots of stuff]
}

Hanya saja, itu tidak pernah sampai ke file aplikasi. Jika saya berkomentar include custommod, kesalahan di atas dihasilkan pada class{ "custommod::apps": frontend => "false}baris sebagai gantinya.

Apa yang saya lewatkan dalam perburuan saya untuk mengetahui bagaimana kesalahan ini dihasilkan? Saya perlu mencatat bahwa repo ini berfungsi dengan baik jika dijalankan secara lokal via puppet apply.

sysadmin1138
sumber
Apakah Anda mengambil puncak dalam file yaml klien untuk melihat apakah kelas Anda ada?
Zoredache
@Zoredache Direktori / var / lib / puppet / client_yaml / kosong pada klien. Klien mendapatkan could not retrieve catalog from remote server:kesalahan yang mungkin mengapa.
sysadmin1138
Hrm .. buat kembali tata letak dasar dan struktur impor Anda dan tidak dapat mereproduksi masalah (pada 2.7.1). Harus aman untuk berhenti termasuk yang kosong custommod- mungkin bahkan mencoba menghapus init.ppsemuanya, karena seharusnya tidak diperlukan.
Shane Madden
@ShaneMadden Setelah saya mencobanya, langkah saya selanjutnya adalah melemparnya stracedan mencoba mencari tahu file apa yang ingin dibaca seperti itu.
sysadmin1138

Jawaban:

32

Jadi ... ini agak memalukan, tapi ...

Lingkungan.

Di sana dalam /etc/puppet.conffile saya adalah ini:

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

Setelah melemparnya straceuntuk mencari tahu di mana ia mencari file, saya perhatikan sesuatu. Itu sedang mencari custommod di bawah /etc/puppet/environments/production/modules, dan karena ada direktori di sana (kosong), maka tidak pergi memeriksa/etc/puppet/modules . Rupanya ketika mengimpor modul itu memeriksa keberadaan direktori, bukan kehadiran file (init.pp).

Hapus direktori kosong itu, semuanya mulai berfungsi.

Jalankan agen boneka menggunakan lingkungan yang berbeda, semuanya mulai bekerja.

Pesan moral dalam cerita:

Jalur Wayang Lingkungan tidak bertindak seperti bash $ PATH.

sysadmin1138
sumber
8
Dan jika seseorang belum mendefinisikan modulepath mereka secara eksplisit di puppet.conf, dan mereka ingin mengetahui modulepath boneka tanpa menggunakan strace, mereka juga dapat berlari puppet config print modulepath.
Alison R.
1
Apakah ini sudah dilaporkan ke puppetlabs?
Felipe Alvarez
3
Modulepath sekarang memicu peringatan penghentian.
Magellan
4

Saya mengalami masalah yang sama, tetapi memiliki perbaikan yang berbeda

Jika Anda membuat modul boneka seperti:

puppet module generate foo-example_module

Ini akan membuat modul bernama example_moduledengan fooruang nama. Semua manifes akan berada di dalam direktori yang disebutfoo-example_module

Nama kelas yang didefinisikan dalam init.pp harus sama dengan nama folder.

Perbaikan sederhana:

mv foo-example_module example_module

Jika Anda menjalankan puppet-lint, itu akan memperingatkan dengan pesan berikut:

ERROR: example_module not in autoload module layout on line 42

Jika menggunakan Puppetfile dengan r10k atau librarian-puppet, Anda juga mungkin perlu menghapus ruang nama sehingga file-file tersebut ditempatkan tanpa awalan 'foo' di direktori modul Anda.

sebelum:

mod 'foo-example_module',
    :git => [email protected]:foo/example_module'

setelah:

mod 'example_module',
    :git => [email protected]:foo/example_module'
spuder
sumber
0

Mengalami masalah serupa dengan boneka 3.7.1 untuk Fedora: Tidak dapat menemukan boneka kelas untuk my.server

Larutan:

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

Lalu berhasil.

Haibo Liu
sumber
0

Saya punya masalah serupa. Dalam kasus saya, nama kelasnya adalah "onehost :: change_IoT_password_reminder". Setelah menggunakan strace saya menemukan boneka itu mencari file modules / onehost / manifests / change_iot_password_reminder.pp. Tampaknya menggunakan huruf besar dalam nama kelas bukanlah ide yang baik, bahkan jika itu bukan huruf pertama dari kelas tersebut.

Geoff Crompton
sumber