Không thể tìm thấy lớp học, và nó ở đó


31

Khi thực hiện puppet agentcuộc gọi từ một hình ảnh mới, tôi gặp err: Could not find class custommodlỗi. Bản thân mô-đun này /etc/puppet/modules/custommodgiống như tất cả các mô-đun khác mà chúng tôi đang gọi, nhưng mô-đun này là chướng ngại vật.

[trang web.pp]

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

Khi con rối được chạy với đầu ra gỡ lỗi, nó rõ ràng tìm thông tin cho cơ sở và cuộn tròn:

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

Dòng 84 là include custommod

Một thư mục viết tắt và cấu trúc tệp:

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

Tôi đã kiểm tra chính tả:}

Nội dung của init.pptrong thư mục lưu trữ là hoàn toàn không đáng kể:

class custommod {
}

Mục đích là để tạo một lớp trống cho tệp apps.pp, nơi chứa thịt.

class custommod::apps {

    [lots of stuff]
}

Chỉ, nó không bao giờ vào tập tin ứng dụng. Nếu tôi nhận xét include custommod, lỗi ở trên được tạo ra trên class{ "custommod::apps": frontend => "false}dòng thay thế.

Tôi còn thiếu gì trong cuộc săn lùng của mình để tìm hiểu xem lỗi này được tạo ra như thế nào? Tôi cần lưu ý rằng repo này chỉ hoạt động tốt nếu nó được chạy cục bộ thông qua puppet apply.


Bạn đã lấy một đỉnh trong tệp yaml của khách hàng để xem lớp của bạn có mặt không?
Zoredache

@Zoredache Thư mục / var / lib / Puppet / client_yaml / trống trên máy khách. Các khách hàng đang nhận được một could not retrieve catalog from remote server:lỗi có lẽ là lý do tại sao.
sysadmin1138

Hrm .. đã tạo lại bố cục cơ bản và cấu trúc nhập của bạn và không thể tái tạo vấn đề (trên 2.7.1). Nên an toàn để dừng bao gồm cả trống custommod- thậm chí có thể thử xóa init.pphoàn toàn, vì nó không cần thiết.
Shane Madden

@ShaneMadden Sau khi tôi thử điều đó, bước tiếp theo của tôi là ném stracevào nó và cố gắng tìm ra những tập tin mà nó đang cố đọc theo cách đó.
sysadmin1138

Câu trả lời:


32

Vì vậy, ... điều này hơi xấu hổ, nhưng ...

Môi trường.

Ngay trong /etc/puppet.conftập tin của tôi là đây:

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

Sau khi ném stracevào nó để tìm ra nơi nó đang tìm kiếm các tập tin, tôi nhận thấy một cái gì đó. Nó đang tìm kiếm hàng hóa bên dưới /etc/puppet/environments/production/modules, và vì có một thư mục ở đó (trống), nên nó đã không đi kiểm tra/etc/puppet/modules . Rõ ràng khi nhập một mô-đun, nó kiểm tra sự hiện diện của thư mục, thay vì hiện diện tệp (init.pp).

Xóa thư mục trống đó, mọi thứ bắt đầu làm việc.

Chạy tác nhân bù nhìn bằng một môi trường khác, mọi thứ bắt đầu hoạt động.

Đạo đức của câu chuyện:

Đường dẫn môi trường rối không hoạt động như bash $ PATH.


8
Và trong trường hợp ai đó chưa xác định rõ đường dẫn mô-đun của họ trong Puppet.conf và họ muốn tìm hiểu đường dẫn mô-đun của con rối mà không cần dùng đến bước đi, họ cũng có thể chạy puppet config print modulepath.
Alison R.

1
điều này đã được báo cáo cho con rối?
Felipe Alvarez

3
Mô-đun bây giờ kích hoạt cảnh báo khấu hao.
Magellan

4

Tôi gặp vấn đề tương tự, nhưng đã có một cách khắc phục khác

Nếu bạn tạo một mô đun con rối như vậy:

puppet module generate foo-example_module

Nó sẽ tạo ra một mô-đun có tên example_modulevới fookhông gian tên. Tất cả các bảng kê khai sẽ nằm trong một thư mục có tênfoo-example_module

Tên của lớp được định nghĩa trong init.pp cần giống với tên thư mục.

Cách khắc phục đơn giản:

mv foo-example_module example_module

Nếu bạn chạy rối, nó sẽ cảnh báo với thông báo sau:

ERROR: example_module not in autoload module layout on line 42

Nếu sử dụng Puppetfile với r10k hoặc librarian-Puppet, bạn cũng có thể cần phải xóa không gian tên để các tệp được đặt mà không có tiền tố 'foo' trong thư mục mô-đun của bạn.

trước:

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

sau:

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


0

Gặp vấn đề tương tự với con rối 3.7.1 đối với Fedora: Không thể tìm thấy con rối lớp cho my.server

Dung dịch:

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

Sau đó, nó hoạt động.


0

Tôi đã có một vấn đề tương tự. Trong trường hợp của tôi, tên lớp là "onehost :: change_IoT_password_reminder". Sau khi sử dụng strace, tôi thấy rằng con rối đang tìm kiếm một mô-đun / onehost / manifest / change_iot_password_reminder.pp. Có vẻ như sử dụng chữ in hoa trong tên lớp không phải là ý hay, ngay cả khi đó không phải là chữ cái đầu tiên của lớp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.