Назад | Перейти на главную страницу

Не удалось найти класс, но он есть

При выполнении 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 запускается с выводом отладки, он явно находит информацию для base и curl:

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.

Так ... это немного смущает, но ...

Среды.

Прямо там, в моем /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.

Я столкнулся с той же проблемой, но имел другое решение

Если вы создаете марионеточный модуль следующим образом:

puppet module generate foo-example_module

Будет создан модуль с именем example_module с foo пространство имен. Все манифесты будут внутри каталога с именем foo-example_module

Имя класса, определенного в init.pp, должно совпадать с именем папки.

Простое исправление:

mv foo-example_module example_module

Если вы запустите puppet-lint, он выдаст следующее сообщение:

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'

Другая проблема, которая может возникнуть, - это когда ваш модуль имеет недопустимый metadata.json файл.

Убедитесь, что metadata.json в файле есть все обязательные поля (см. https://docs.puppet.com/puppet/latest/reference/modules_metadata.html#allowed-keys-in-metadatajson )

Возникла аналогичная проблема с марионеткой 3.7.1 для Fedora: не удалось найти марионетку класса для my.server

Решение:

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

Тогда это работает.

У меня была похожая проблема. В моем случае имя класса было «onehost :: change_IoT_password_reminder». После использования strace я обнаружил, что марионетка искала файл modules / onehost / manifest / change_iot_password_reminder.pp. Похоже, использование заглавных букв в именах классов - не лучшая идея, даже если это не первая буква класса.