Не смог найти класс, и все же он есть

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

sysadmin1138
источник
Вы взяли пик в файле клиента 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).

Удалите этот пустой каталог, все начнет работать.

Запустите агент Puppet, используя другую среду, все начинает работать.

Мораль истории:

Пути Puppet Environment не действуют как bash $ PATH.

sysadmin1138
источник
8
И в случае, если кто-то не определил свой путь модуля явно в puppet.conf, и он хочет узнать путь модуля куколки, не прибегая к strace, он также может работать 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

Если вы запустите 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'
spuder
источник
0

Обнаружена похожая проблема с puppet 3.7.1 для Fedora: не удалось найти класс puppet для my.server

Решение:

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

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

Хайбо Лю
источник
0

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

Джефф Кромптон
источник