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

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

Я регулярно, но случайно получаю следующее сообщение об ошибке, когда запускаю марионеточный клиент на машинах (недемонизированных):

err: Could not create : Parameter path failed: File paths must be fully qualified
warning: Not using cache on failed catalog
warning: Configuration could not be instantiated: Parameter path failed: File paths must be fully qualified

Кажется умеренно ясным, что это означает - что у меня нет полного пути в параметре. Однако это не говорит мне где Я могу найти это, чтобы исправить это, или даже какой параметр неверен :(

(Если я использую параметр отладки, он работает стабильно, поэтому кажется, что проблема с кешированием манифестов ... Было бы неплохо избавиться от этого для производственного использования, тем не менее)

Примечание: я не могу заставить это происходить постоянно : /

[Отвечаю на собственный вопрос после того, как немного поработал над конфигурацией]

Мне удалось отследить это до одного из модулей, которые я написал (конечно), но это произошло из-за использования переменной, которая не сработала так, как я ожидал.

Произошло следующее:

$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, поэтому я собираюсь узнать, что много лучше...

Кажется, это вызвало то же поведение, что и использование неполных путей в строках файлов, из-за того, что не удалось найти переменную или не получить значение? Во всяком случае, довольно странно.

Изменить: вполне возможно, что переменная не была найдена в области видимости, поэтому была пуста и определенно не являлась полностью определенным путем. Однако не объясняет, почему это не соответствовало ...

Когда вы тестируете конфигурацию марионетки, вы можете сделать это, запустив

puppetd --test

что даст вам гораздо более подробный вывод, и он должен показать вам, где он не работает. Если вы действительно в отчаянии, можете приступить к --debug чтобы получить еще больше результатов.

Если вы хотите заглянуть в свой .pp файлы вы должны искать

file { "path/to/file":
    ...
}

в котором отсутствует / (т.е. он должен читать /path/to/file вместо)

Полный путь должен быть помещен в имя ключа, если вы не используете path параметр.

Например:

file { '/full/path':
  ensure => directory,
  recurse => true,
}

или:

file { 'my name':
  path => "/full/path",
  ensure => directory,
  recurse => true,
}

Если вы используете переменную, убедитесь, что она определена. Если он в другом классе, используйте стандартный $class::variable синтаксис. Для получения дополнительной информации запустите марионетку с -vd (подробный + отладка) параметр.

Вы можете указать фактический путь к свойству 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'],
   }
}