Puppet版本为3.7,OS为Windows 7。
我正在尝试创建只有在某些Windows注册表值不存在时才会执行的Puppet exec。我正在尝试使用这样的代码:
exec { 'example':
path => 'C:\Windows\System32',
command => 'something',
unless => 'reg query "HKEY_LOCAL_MACHINE\Software\My key" /f 5.1',
}
如果我在命令行上使用reg query
,我会得到:
C:\>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\My key" /f 5.1
HKEY_LOCAL_MACHINE\SOFTWARE\My key REG_SZ 5.1
End of search: 1 match(es) found.
C:\>echo %errorlevel%
0
由于结果此命令为0且unless
仅在结果不为0时才应执行,因此命令不应执行。但是每次都会执行它。
我也尝试过使用unless => 'cmd.exe /C reg query "HKEY_LOCAL_MACHINE\Software\My key" /f 5.1',
,但每次都会执行命令。
此处的类似问题表明这种方式应该有效:Exec onlyif registry value is not present。
我在这里做错了什么?
编辑:调试显示Puppet根本找不到密钥:
Debug: Exec[update](provider=windows): Executing check 'reg query "HKLM\SOFTWARE\My key" /f 5.1'
Debug: Executing 'reg query "HKLM\SOFTWARE\My key" /f 5.1'
Debug: /Stage[main]/Example/Exec[update]/unless: ERROR: The system was unable to find the specified registry key or value.
如果我在命令行上运行相同的reg query
命令,它会找到如上所示的密钥。
答案 0 :(得分:1)
确保您不受registry redirection或file system redirection的约束。通常就是这种情况 - 如果您使用的是64位Windows操作系统,则最好使用64位版本的Puppet。
我们在troubleshooting中注意到了文件系统重定向器和变通方法。我们也谈过registry redirection for custom facts。在您的情况下,当您尝试呼叫c:\windows\system32\cmd.exe
时,可能需要进行文件系统重定向。
缺点是,您应该确保使用64位版本的cmd.exe,该版本位于c:\windows\sysnative
或c:\windows\system32
。 $system32
事实从with Puppet 3.7.3开始解决:
exec { 'example':
path => "$system32',
command => 'something',
unless => 'reg query "HKEY_LOCAL_MACHINE\Software\My key" /f 5.1',
}
答案 1 :(得分:0)
一般提示,之前当我们遇到同样的问题时,我们在注册表项名称(可能还有空格字符)中转义了反斜杠以使其工作。
exec { 'example':
path => 'C:\Windows\System32',
command => 'something',
unless => 'reg query \"HKEY_LOCAL_MACHINE\\SOFTWARE\\My\ key\" /f 5.1',
}
另外,如果你想使用与“cmd”相同的内容,如下所示:
exec { "example":
command => "something",
unless => 'cmd /c "C:\\Windows\\System32\\reg.exe query \"HKEY_LOCAL_MACHINE\\SOFTWARE\\My\ key\" /f 5.1"',
}