
Я регулярно, но случайным образом получаю следующее сообщение об ошибке при запуске клиента Puppet на машинах (не демонизированных):
err: Не удалось создать: Ошибка пути к параметру: Пути к файлам должны быть полностью определены предупреждение: не используется кэш при сбое каталога предупреждение: Не удалось создать экземпляр конфигурации: Не удалось указать путь к параметру: Пути к файлам должны быть полностью определены
Кажется, довольно ясно, что это значит — у меня нет полностью определенного пути в параметре. Однако, это не говорит мнегдеЯ могу найти, как это исправить, или даже какой параметр неверен :(
(Если я использую опцию отладки, то все работает стабильно, так что, похоже, проблема в кэшировании манифестов... Было бы неплохо избавиться от этого при использовании в продакшне)
Примечание: я не могу сделать так, чтобы это происходило постоянно. :/
решение1
[Отвечаю на свой собственный вопрос после того, как некоторое время поковырялся в конфигурации]
Мне удалось отследить это до одного из модулей, которые я написал (конечно), но это было связано с использованием переменной, которая не сработала так, как я ожидал.
Произошло следующее:
$variable_dir = "/etc/puppet/bar"
class foo {
file { $variable_dir:
ensure => directory
}
}
define some-define() {
# Trimmed for brevity
exec { "some-$name":
# command, creates, timeout etc here
require => File[$variable_dir],
}
}
..что в основном вызвало некоторую путаницу с File[], использующим переменную. Я заменил их на явное значение переменной на данный момент, и все работает нормально, но это было чем-то вроде сюрприза! Я предполагаю, что мое понимание области действия и того, когда переменные могут быть определены/использованы, несколько не в порядке с Puppet, поэтому я собираюсь узнать, чтомноголучше...
Похоже, это вызвало то же поведение, что и использование неполных путей в строках файлов, не найдя переменную или не получив значение? Довольно странно, в любом случае.
Редактировать: вполне возможно, что переменная не была найдена в области видимости, и поэтому была пустой и определенно не являлась полностью определенным путем. Однако это не объясняет, почему это не было согласовано...
решение2
Когда вы тестируете конфигурацию вашей puppet, вы можете сделать это, запустив
puppetd --test
что даст вам гораздо более подробный вывод, и он должен показать вам, где он терпит неудачу. Если вы действительно в отчаянии, вы можете присоединить его, --debug
чтобы получить еще больше вывода.
Если вы хотите поискать в своих .pp
файлах, вам следует поискать
file { "path/to/file":
...
}
в котором отсутствует /
(т.е. вместо этого следует читать /path/to/file
)
решение3
Вы можете поместить фактический путь в свойство path, тогда это сработает. Это работает для меня:
$variable_dir = "/etc/puppet/bar"
class foo {
file { 'variable_dir':
path => ${variable_dir},
ensure => directory
}
}
define some-define() {
# Trimmed for brevity
exec { "some-$name":
# command, creates, timeout etc here
require => File['variable_dir'],
}
}
решение4
Полный путь должен быть указан в имени ключа, если только вы не используете path
параметр.
Например:
file { '/full/path':
ensure => directory,
recurse => true,
}
или:
file { 'my name':
path => "/full/path",
ensure => directory,
recurse => true,
}
Если вы используете переменную, убедитесь, что она определена. Если она в другом классе, используйте стандартный $class::variable
синтаксис. Для получения дополнительной информации запустите puppet с -vd
параметром (verbose+debug).