【问题标题】:Puppet: Conditional exec using unless-optionPuppet:使用除非选项的条件执行
【发布时间】:2015-02-25 11:32:53
【问题描述】:

Puppet 版本为 3.7,操作系统为 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

因为 result 这个命令是 0 并且unless 应该只在 result 不为 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 命令,它会找到如上所示的密钥。

【问题讨论】:

  • 你能从puppet agent --test --debug的输出中添加一段相关的摘录吗?
  • 调试提供了新信息。 Puppet 找不到我正在寻找的注册表项,尽管在命令行上执行相同的命令时找到它。
  • 这毕竟可能是一个引用问题。我不确定windows 提供者是否会在这里做正确的事情。标记化可能很棘手。

标签: windows command-line registry puppet


【解决方案1】:

确保您不受registry redirectionfile system redirection 的约束。通常是这种情况 - 如果您使用的是 64 位 Windows 操作系统,则最好使用 64 位版本的 Puppet。

我们在troubleshooting 中记录了文件系统重定向器和解决方法。我们还谈到了registry redirection for custom facts。在您的情况下,当您尝试调用 c:\windows\system32\cmd.exe 时,可能会受到文件系统重定向的影响。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 您还没有克服在 64 位系统上运行 32 位 Puppet 的可能性。因此,如果它们在 32 位 Puppet 上运行,它们都将受制于 Windows 文件系统重定向器。请参阅 puppetlabs.com/blog/how-avoid-common-windows-gotchas-puppet 和 cmets。
    • 首先谢谢@ferventcoder 我不知道这个(我知道windows Wow64 在windows 上的实现)。你提供的puppet labs 链接提供了一个很好的puppetlabs-registry,真的很好,谢谢。 “ferventcoder”,但我的问题是,如果我们在 64 位 Windows 上指定“C:\Windows\System32\reg 查询”,那么根据文档(您提供的链接),它应该被重定向到 c:\windows \SysWOW64 因为它是由windows直接完成的,对吗?所以,我的答案也应该在 32 位或 64 位上运行,因为路由是由 Windows 内部完成的(对不起,我现在无法使用 64 位系统
    • 是的,在 64 位系统上的 32 位进程中,对 C:\Windows\System32 的调用被重定向到 C:\Windows\SysWOW64。但可能发生的情况是,这将打开注册表的 32 位视图,其中可能不包括您在正常打开 regedit 时看到的值(HKLM:\SOFTWARE\Wow6432Node 现在是 HKLM:\SOFTWARE)。 Windows 这样做并不明显,并且会产生像 OP 这样的问题,其中 Puppet 甚至找不到注册表值 - 存在 64 位应用程序,它们只是对 32 位注册表视图不可见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多