问题描述
我正在使用Puppet设置工作站,并且我想在用户登录之前修改默认(NTUSER.DAT)HKLM注册表,这涉及加载和卸载配置单元。我已经编写了一些PowerShell脚本以方便加载/卸载。尽管我有三种不同的操作,但是在registry
模块可以进行 all 更改之前,Puppet似乎试图卸载配置单元。我相信我需要使用subscribe
和refreshonly
添加一些依赖项。
这个问题与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'),}
我想我可以将加载/卸载exec资源放入.each
循环中并添加subscribe
和refreshonly
,但是,对每个项目执行此操作似乎效率很低。 / p>
如果有人有任何想法,请与我分享,我将不胜感激。
T.I.A。
解决方法
我认为我需要使用
subscribe
和refreshonly
添加一些依赖项。
我不确定您是否需要添加依赖项,因为在没有显式依赖项的情况下,应按照资源在清单中出现的相对顺序来应用资源。此外,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时,都必须同时加载和卸载配置单元,因为如果不这样做,就无法确定是否需要更新任何条目。