Как исправить ошибку полного пути к параметрам Puppet?

Как исправить ошибку полного пути к параметрам Puppet?

Я регулярно, но случайным образом получаю следующее сообщение об ошибке при запуске клиента 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).

Связанный контент