如何使用 Puppet 动态 select 基于 32/64 位 OS 的系统文件夹路径
How to Dynamically select the path to System folder based on 32/64 bit OS with Puppet
我正在使用 Puppet 在 Windows 2008 服务器 R2 上自动部署我的 Web 应用程序。
我将通过几个步骤访问系统文件夹(System32 或 SysWOW64,具体取决于 32/64 位 OS)。
让我采取以下步骤之一:我将访问 'appcmd.exe' 到 Start/Stop 网站。当脚本在32位机器上为运行时,我需要访问'C:/Windows/System32/inetsrv/appcmd.exe'
处的文件,当脚本在64位机器上为运行时,我需要访问文件在 'C:/Windows/SysWOW64/inetsrv/appcmd.exe'
这是我编写的脚本部分。我不想硬编码路径。根据 OS,我希望选择 'appcmd.exe' 的路径。我怎样才能做到这一点?
exec {"StopWebsite":
command=> 'C:/Windows/System32/inetsrv/appcmd.exe stop site /site.name:"Default Web Site"'
}
不是要让你失望,但你看过 puppet-iis 模块(以前是 OpenTable 的 IIS 模块)吗?
如何使用 32 位应用程序(如果可用)
回答您的问题,这是我第一次听说要访问 32 位应用程序的请求。以下内容适用于 32 位和 64 位操作系统上的 32 位或 64 位 Puppet:
exec {'StopWebsite':
path => 'C:/Windows/SysWOW64/inetsrv;C:/Windows/System32/inetsrv',
command => 'appcmd.exe stop site /site.name:"Default Web Site"',
}
之所以有效,是因为它会先检查 C:\Windows\SysWOW64
中的命令,然后再转到 C:\Windows\system32
。这允许它在运行时下降到正确的 32 位 appcmd.exe
。
如何使用 64 位应用程序(如果可用)
对于其他人,如果您总是尝试使用 64 位进程和 Puppet 3.7.3 或更高版本,请使用 $system32 事实。无论您使用的是 64 位还是 32 位版本的 Puppet,这都有效。
exec {'somefunction':
command => "$system32\cmd.exe /c some command",
}
或者您也可以尝试相反的技巧,设置路径顺序,使其首先获得 sysnative,然后回退到 system32。
exec {'somefunction':
path => 'C:/Windows/sysnative;C:/Windows/System32',
command => 'cmd.exe /c some command',
}
保持路径的其余部分不变
如果你需要保留路径的其余部分,只需将 $path
附加到字符串的末尾,但用双引号指定它:
path => "C:\Windows\sysnative;C:\Windows\System32;$::path",
您可能对正斜杠没问题,但 $path
的其余部分带有反斜杠,所以我不想混淆处理程序。
我正在使用 Puppet 在 Windows 2008 服务器 R2 上自动部署我的 Web 应用程序。
我将通过几个步骤访问系统文件夹(System32 或 SysWOW64,具体取决于 32/64 位 OS)。
让我采取以下步骤之一:我将访问 'appcmd.exe' 到 Start/Stop 网站。当脚本在32位机器上为运行时,我需要访问'C:/Windows/System32/inetsrv/appcmd.exe'
处的文件,当脚本在64位机器上为运行时,我需要访问文件在 'C:/Windows/SysWOW64/inetsrv/appcmd.exe'
这是我编写的脚本部分。我不想硬编码路径。根据 OS,我希望选择 'appcmd.exe' 的路径。我怎样才能做到这一点?
exec {"StopWebsite":
command=> 'C:/Windows/System32/inetsrv/appcmd.exe stop site /site.name:"Default Web Site"'
}
不是要让你失望,但你看过 puppet-iis 模块(以前是 OpenTable 的 IIS 模块)吗?
如何使用 32 位应用程序(如果可用)
回答您的问题,这是我第一次听说要访问 32 位应用程序的请求。以下内容适用于 32 位和 64 位操作系统上的 32 位或 64 位 Puppet:
exec {'StopWebsite':
path => 'C:/Windows/SysWOW64/inetsrv;C:/Windows/System32/inetsrv',
command => 'appcmd.exe stop site /site.name:"Default Web Site"',
}
之所以有效,是因为它会先检查 C:\Windows\SysWOW64
中的命令,然后再转到 C:\Windows\system32
。这允许它在运行时下降到正确的 32 位 appcmd.exe
。
如何使用 64 位应用程序(如果可用)
对于其他人,如果您总是尝试使用 64 位进程和 Puppet 3.7.3 或更高版本,请使用 $system32 事实。无论您使用的是 64 位还是 32 位版本的 Puppet,这都有效。
exec {'somefunction':
command => "$system32\cmd.exe /c some command",
}
或者您也可以尝试相反的技巧,设置路径顺序,使其首先获得 sysnative,然后回退到 system32。
exec {'somefunction':
path => 'C:/Windows/sysnative;C:/Windows/System32',
command => 'cmd.exe /c some command',
}
保持路径的其余部分不变
如果你需要保留路径的其余部分,只需将 $path
附加到字符串的末尾,但用双引号指定它:
path => "C:\Windows\sysnative;C:\Windows\System32;$::path",
您可能对正斜杠没问题,但 $path
的其余部分带有反斜杠,所以我不想混淆处理程序。