在交互循环中触发依赖资源

Triggering dependent resources in a interation loop

我正在使用 Puppet 设置工作站,我想在用户登录之前修改默认的 (NTUSER.DAT) HKLM 注册表,这涉及加载和卸载配置单元。我已经编写了一些 PowerShell 脚本来促进 load/unload。虽然我有三个不同的操作,但 Puppet 似乎试图在 registry 模块可以进行 all 更改之前卸载配置单元。我相信我需要使用 subscriberefreshonly.

添加一些依赖项

这个问题和非常相似,只是我的数据在Hiera中,所以我想遍历数据。

$temp_hive_name = $base_windows::temp_hive_name

# LOAD REGISTRY HIVE
exec { 'load_registry_hive' :
  command   => template('base_windows/Load-RegHive.ps1.erb'),
  unless    => template('base_windows/Test-HiveLoadState.ps1.erb'),
  provider  => powershell,
  logoutput => true,
}

# MODIFY REGISTRY, ITERATING OVER HIERA DATA
$base_windows::registry.each | $key, $value | {
  registry::value { "registry_${key}" :
    key   => "${value['key']}\${temp_hive_name}\${value['subkey']}",
    type  => $value['type'],
    data  => $value['data'],
    value => $value['value'],
  }
}

# UNLOAD REGISTRY HIVE
exec { 'unload_registry_hive' :
  command   => template('base_windows/Unload-RegHive.ps1.erb'),
  onlyif    => template('base_windows/Test-HiveLoadState.ps1.erb'),
  provider  => powershell,
  logoutput => true,
}

当有一个或两个 Hiera 条目时,这工作正常。

我想我可以将加载/卸载 exec 资源放入 .each 循环并添加 subscriberefreshonly,但是,对每个项目执行此操作似乎效率很低.

如果有人有任何想法,能否分享一下,我将不胜感激?

T.I.A.

I believe I need to add some dependencies using subscribe and refreshonly.

我不太确定您是否需要添加依赖项,因为没有明确的依赖项,资源应该按照它们在清单中出现的相对顺序应用。此外,refreshonly 未声明依赖项,并且 subscribe 可能不适合此特定任务。此外,尽管 refreshonly 与依赖项一起工作,但它可能也不适合此任务,因为 notify / subscribe 不适合它。

一般来说,关键问题是这些:

  • 必须先加载配置单元,然后才能尝试同步任何注册表项,因此如果不先加载配置单元,就无法知道任何给定的注册表资源是否不同步;

  • 如果已加载配置单元,则还必须将其卸载;

  • 但在同步所有注册表项之前不得卸载配置单元。

您不能设置 Exec['load_registry_hive'] refreshonly,因为没有资源可以发出信号。但是,您可以检查 $base_windows::registry 是否有任何元素作为执行任何工作的先决条件。如果是,那么您肯定需要加载配置单元。

可以设置显式依赖关系,我通常倾向于这样做,因为它可以防止资源受到不明显的依赖边缘影响时出现意外其声明的要点。所以我建议:

$temp_hive_name = $base_windows::temp_hive_name

if ! $base_windows::registry.empty() {
  # LOAD REGISTRY HIVE
  exec { 'load_registry_hive' :
    command   => template('base_windows/Load-RegHive.ps1.erb'),
    unless    => template('base_windows/Test-HiveLoadState.ps1.erb'),
    provider  => powershell,
    logoutput => true,
  }

  # MODIFY REGISTRY, ITERATING OVER HIERA DATA
  $base_windows::registry.each | $key, $value | {
    registry::value { "registry_${key}" :
      key     => "${value['key']}\${temp_hive_name}\${value['subkey']}",
      type    => $value['type'],
      data    => $value['data'],
      value   => $value['value'],
      require => Exec['load_registry_hive'],
      before  => Exec['unload_registry_hive'],
    }
  }

  # UNLOAD REGISTRY HIVE
  exec { 'unload_registry_hive' :
    command   => template('base_windows/Unload-RegHive.ps1.erb'),
    onlyif    => template('base_windows/Test-HiveLoadState.ps1.erb'),
    provider  => powershell,
    logoutput => true,
  }
}

请注意,您必须在每个 Puppet 上加载和卸载配置单元 运行,因为如果不这样做,您无法确定是否需要更新任何条目。