При выполнении 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. Похоже, использование заглавных букв в именах классов - не лучшая идея, даже если это не первая буква класса.