У вас есть объявления ресурсов для указания того, что на целевом узле должен быть указан конкретный ключ и значение реестра. Если у вас также есть объявления, указывающие, что один или оба должны отсутствовать, и Puppet оценивает оба набора , то что вы на самом деле говорите Puppet? Он не может соответствовать обоим наборам деклараций.
Puppet очень осторожно подходит к таким ситуациям, что имеет смысл, учитывая его роль в управлении инфраструктурой. Если один и тот же ресурс объявлен более одного раза для одной и той же цели, Puppet прерывается. Время от времени это создает практические трудности, но я уверен, что это защитило многие, многие системы от неправильной конфигурации.
Решение состоит в том, чтобы гарантировать, что ваш набор манифестов объявляет только один набор этих объявлений для каждого узла. Вы можете сделать это, имея только один набор и динамически изменяя их $ensure
параметры, как предлагает @AlexHarvey. Вы также можете сделать это, поместив два набора объявлений в разные блоки и выбирая между ними условные операторы. Или вы можете поместить их в совершенно разные классы и обязательно включить только один из них для каждого узла.
Но я должен отличиться от Алекса здесь по специфике. Обычно я не использовал бы здесь пользовательский факт, потому что он дает контроль над тем, какой вариант используется клиенту. Вообще говоря, я хочу, чтобы мастер задавал вопросы о том, как настраиваются различные узлы. Для этого довольно распространенной идиомой является использование параметра класса для управления наличием или отсутствием ресурсов:
class mymodule::windows_update(
Enum['absent','present'] $ensure = $present,
$test_key_value
) {
registry_key { 'HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate':
ensure => $ensure,
}
registry_value { 'HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\TestKey':
ensure => $ensure,
type => dword,
data => $test_key_value,
}
}