Puppet:使用除非选项的条件执行

Puppet: Conditional exec using unless-option

Puppet 版本是 3.7,OS 是 Windows7.

我正在尝试创建仅在某些 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 命令,它会找到如上所示的密钥。

确保您不受 registry redirection or file system redirection 的约束。通常是这种情况 - 如果您使用的是 64 位 Windows OS,您最好使用 64 位版本的 Puppet。

我们在 troubleshooting. We've also touched on registry redirection for custom facts 中注意到了文件系统重定向器和解决方法。在您的情况下,可能是您在尝试调用 c:\windows\system32\cmd.exe.

时受到文件系统重定向的影响

简而言之,您应该确保您使用的是 cmd.exe 的 64 位版本,它在 c:\windows\sysnativec:\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',
}

一般提示,以前当我们遇到同样的问题时,我们转义了注册表项名称中的反斜杠(可能还有 space 字符)以使其正常工作。

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