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\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',
}
一般提示,以前当我们遇到同样的问题时,我们转义了注册表项名称中的反斜杠(可能还有 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"',
}
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\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',
}
一般提示,以前当我们遇到同样的问题时,我们转义了注册表项名称中的反斜杠(可能还有 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"',
}