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

Проблемы с проверкой манифестов Puppet с помощью функции «puppet parser validate»

я использую puppet parser validate в мерзавце pre-commit перехватчик, чтобы выявить проблемы перед фиксацией файлов в нашем репозитории конфигурации Puppet. К сожалению, эта команда представляет собой очень легкую проверку синтаксиса, которая отмечает только ошибки, такие как несбалансированные кавычки и скобки.

В validate похоже, что команда на самом деле не анализирует конфигурацию и не ищет такие вещи, как недопустимые атрибуты, неопределенные ссылки и т. д. Например, следующее не приведет к жалобе:

file { 'somefile': requires => File['some-other-file'] }

В этом примере requires должно быть require. Точно так же это также не вызывает ошибок:

file {'somefile': require => File['file-that-does-not-exist']}

Нет определения ресурса для file-that-does-not-exist.

Есть ли способ отловить такого рода ошибки без фактического применения конфигурации? Я надеялся на какой-то флаг на puppet apply команда, которая полностью проанализирует конфигурацию без внесения изменений, но, насколько я могу судить, такой опции нет в Puppet 2.7.1.

ОБНОВИТЬ

puppet apply --noop кажется, слишком старается в другом направлении. Он попытается stat() любой файл, указанный в манифесте, что часто приводит к сбою с ошибками разрешения, если он пытается stat() файл, который недоступен текущему пользователю.

Что делают другие люди?

Вы можете рассмотреть возможность начальной загрузки тестовой среды, такой как Cucumber-puppet.

https://github.com/nistude/cucumber-puppet

Короче говоря, это нетривиальная проблема, и ее нелегко решить, проанализировав манифесты. Составление каталога может расширить рамки тестирования, но это не панацея. puppet master --compile требует доступа к фактам узла и в идеале фиктивного узла, который полностью тестирует все классы. Вам все равно придется столкнуться с ограничениями:

  • классы, которые не могут быть в одном каталоге (apache, apache :: disable)
  • кросс-классовая зависимость.
  • разные платформы ОС.
  • узлы с разными параметрами.

Например, если узел один включает a и b, это нормально, но узел два требует только b, это только сбой, который вы увидите с узлом два.

class a {
  notify { 'hi': }
}
class b {
  notify { 'bye':
    require => Notify['hi'],
  }
}

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

puppet apply --noop также имеет свои ограничения, вне моей головы: он выдает сбой в exec, развернутом пакетом, он отказывает файлы в зависимости от места размещения, и он не будет тестировать несколько платформ, если вы не развернете тестирование репрезентативной выборки ваших систем. В целом он обеспечивает достаточное покрытие, чтобы гарантировать отсутствие проблем с компиляцией, дает вам представление о том, какие системы затронуты, какие изменения, и вы можете судить по отчетам, являются ли изменения правильными или реальная проблема.

В большинстве случаев достаточно noop, я видел различные степени автоматизированного тестирования, такие как jenkins, где каждый файл тестов модулей моделируется с помощью --noop (применяются указанные выше ограничения), или использование Vagrant для создания виртуальных машин для выполнения полномасштабного тестирования.

Чтобы получить немного больше подтверждения разумности ресурсов и атрибутов, вы можете скомпилировать образец каталога узлов с помощью puppet master --compile. Это должно поймать первый пример.

Я не уверен, что ссылки на ресурсы (второй пример) проверяются на мастере или клиенте, но вы всегда можете выполнить его в режиме без операций с помощью puppet catalog apply, или puppet apply. Последний компилирует его снова и затем применяет, в то время как первый должен иметь возможность брать скомпилированный каталог из более ранней проверки.