微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在交互循环中触发相关资源

如何解决在交互循环中触发相关资源

我正在使用Puppet设置工作站,并且我想在用户登录之前修改认(NTUSER.DAT)HKLM注册表,这涉及加载和卸载配置单元。我已经编写了一些PowerShell脚本以方便加载/卸载。尽管我有三种不同的操作,但是在registry模块可以进行 all 更改之前,Puppet似乎试图卸载配置单元。我相信我需要使用subscriberefreshonly添加一些依赖项。

这个问题与this one非常相似,除了我的数据在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'),}

当有一个或两个Hiera条目时,此方法很好。

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

如果有人有任何想法,请与我分享,我将不胜感激。

T.I.A。

解决方法

我认为我需要使用subscriberefreshonly添加一些依赖项。

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

一般而言,关键问题是这些:

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

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

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

您无法使Exec['load_registry_hive']仅刷新,因为没有资源可以发出信号。但是,您可以检查$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'),}
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。