Puppet - дубликат объявления для Registry_key - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть файл манифеста для добавления ключей реестра и значений, основанных на фактах (работает нормально).

       registry_key { 'HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate':
          ensure => present,
        }

        registry_value { 'HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\TestKey':
         ensure => present,
         type   => dword,
         data   => $test_key_value,
       }

Я хочу добавить второй файл, чтобы удалить их при необходимости, но когда я это получаю, я получаю ошибка

"Дубликат объявления: ключ реестра [HKLM \ SOFTWARE \ Policies \ Microsoft \ Windows \ WindowsUpdate] уже объявлен"

Не знаете, как обойти это - если вообще? Любой совет приветствуется. Очевидно, начинающий кукольный ...

Спасибо

Ответы [ 3 ]

0 голосов
/ 20 февраля 2020

В большинстве случаев совет Алекса заключается в том, чтобы я поступил. Обычно это лучший способ - по умолчанию использовать его в common.yaml и переопределять на основе имени узла или другого уровня в hiera. В зависимости от вашего варианта использования, менее простой способ - обернуть эти блоки в условные (если / если / иначе), где они присутствуют / отсутствуют, в зависимости от логического набора в hiera. Что-то вроде unless $exclude_from_testkey или case оператора. Дайте мне знать, если вы новичок в hiera и / или параметризации.

0 голосов
/ 21 февраля 2020

У вас есть объявления ресурсов для указания того, что на целевом узле должен быть указан конкретный ключ и значение реестра. Если у вас также есть объявления, указывающие, что один или оба должны отсутствовать, и 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,
  }
}
0 голосов
/ 20 февраля 2020

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

$ensure = $facts['include_windows_update_keys']

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,
}

Как вы обнаружили, объявление одного и того же ресурса более одного раза, но с разными атрибутами, не допускается в Puppet.

Подробнее о пользовательских фактах здесь в документации.

...