Не вдалося знайти клас, і все ж він є


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у каталозі custommod абсолютно не примітний:

class custommod {
}

Наміром є створення порожнього класу для файлу apps.pp, де знаходиться м'ясо.

class custommod::apps {

    [lots of stuff]
}

Тільки він ніколи не потрапляє у файл додатків. Якщо я прокоментую це include custommod, class{ "custommod::apps": frontend => "false}натомість помилка генерується вище .

Що мені не вистачає в охоті, щоб дізнатися, як створюється ця помилка? Мені потрібно зазначити, що це РЕПО працює чудово, якщо воно працює локально через puppet apply.


Ви взяли пік у файлі yaml для клієнта, щоб побачити, чи присутній ваш клас?
Зоредаче

@Zoredache Каталог / var / lib / puppet / client_yaml / у клієнта порожній. Клієнт отримує could not retrieve catalog from remote server:помилку, імовірно, саме тому.
sysadmin1138

Хрм .. відтворив основну структуру макета та імпорту і не зміг відтворити проблему (на 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).

Видаліть цей порожній каталог, і все почне працювати.

Запустіть ляльковий агент, використовуючи інше середовище, все почне працювати.

Мораль історії:

Шляхи лялькового середовища не діють як bash $ PATH.


8
І якщо хтось не чітко визначив свій модульний шлях у puppet.conf, і він захоче з'ясувати модульний шлях ляльки, не вдаючись до напруги, він також може запуститись 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

Якщо ви використовуєте Puppetfile з 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 для Fedora: Не вдалося знайти маріонетку класу для мого сервера

Рішення:

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

Тоді це працює.


0

У мене була схожа проблема. У моєму випадку назва класу була "onehost :: change_IoT_password_reminder". Після використання strace я виявив, що лялька шукає файл модулів / onehost / manifests / change_iot_password_reminder.pp. Здається, використання великих літер у назвах класів не є гарною ідеєю, навіть якщо це не перша літера класу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.