我正在使用 Chef 配置 Windows 2012 Server (RTM),包括安装 Octopus Tentacle 服务,这样我就可以使用 Octopus Deploy 将软件部署到该实例上。
我的工作站(Chef 客户端)运行的是 Windows 7 x64 SP1。该服务器托管在 VMware Workstation 中,并运行 Windows 2012 Server x64 RTM。它是从 sysprep 的基线映像启动的,并且在 Chef recipe 尝试创建新的 Octopus 证书之前,一切都运行良好。
octopus.rb Chef 配方包装了一大块 Powershell,实际安装 Octopus Tentacle 的部分如下所示:
$wc = New-Object System.Net.WebClient
$wc.DownloadFile("#{source_path_tanticle}", "#{install_path_tanticle}")
Start-Process -FilePath msiexec -ArgumentList /i, "#{install_path_tanticle}", /quiet -Wait | out-file -filepath C:\\Octopus.log -append
netsh advfirewall firewall add rule name="Octopus" dir=in action=allow protocol=TCP localport=#{tanticle_port} | out-file -filepath C:\\Octopus.log -append
cd "C:\\Program Files (x86)\\Octopus Tentacle\\Agent"
.\\tentacle.exe configure --appdir="C:\\Applications" --port=#{tanticle_port} --trust="#{octopus_server_Thumbprint}" | out-file -filepath C:\\Octopus.log -append
.\\tentacle.exe new-certificate | out-file -filepath C:\\Octopus.log -append
.\\tentacle.exe register-with --server=$octopusServer --publicHostname=$publicDnsName --environment=$environment --role=web --apikey=$octopusServerApiKey | out-file -filepath C:\\Octopus.log -append
当这个脚本调用tentacle.exe new-certificate
它时,它会抛出一个UnauthorizedAccessException
:
Generating and installing a new cetificate...
System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
at Octopus.Shared.Security.CertificateGenerator.Generate(String fullName, Boolean exportable) in c:\w\e6923628be6eaf72\source\Octopus.Shared\Security\CertificateGenerator.cs:line 25
at Octopus.Tentacle.Commands.NewCertificateCommand.Execute() in c:\w\e6923628be6eaf72\source\Octopus.Tentacle\Commands\NewCertificateCommand.cs:line 31
at Octopus.Shared.Startup.CommandProcessor.Process(String[] args) in c:\w\e6923628be6eaf72\source\Octopus.Shared\Startup\CommandProcessor.cs:line 40
Chef 客户端服务以管理员身份运行(至少,当我将 $env:username 转储到安装期间创建的 octopus.log 文件中时,它显示为管理员)所以我不确定 Octopus 触手正在尝试什么文件/文件夹/资源访问。
正在运行以引导节点的实际 Chef 命令是:
knife bootstrap windows winrm 192.168.202.137 -x Administrator -P p@ssw0rd -r 'role[web_server]'
其中 192.168.202.137 是新启动的 Win2012 服务器的 IP 地址,p@ssw0rd 是该服务器上的本地管理员密码。
以管理员身份登录时在服务器上手动运行相同的命令可以完美运行,因此这与 chef/winrm/powershell 远程处理有关。
一种理论是,我遇到了某种 DCOM/WinRM 安全边缘案例,因为我在客户端和服务器上运行不同的操作系统(Win7 x64 与 Win2012) - 但考虑到这里的调用链是 cmd.exe -> Ruby - > WinRM -> Ruby -> Powershell 我对如何补救甚至验证这样的问题有点迷茫......