在过去的一周里,我一直在尝试解决厨师 COOK-1172 的问题,但没有取得多大成功。我正在尝试使用 Chef-Solo 配置程序通过 Vagrant 安装 SQL Server 2008 R2 开发人员版(在我的情况下)。
我已经能够通过直接通过 Ruby WinRM gem 在 Chef 之外重现该问题,然后使用自定义 PowerShell 脚本修复它,该脚本使用传递的凭据在来宾 Windows vagrant box 上启动 setup.exe 进程。换句话说,WinRM gem 调用一个远程 PS 脚本,该脚本在指定的凭据下启动 SQL Server setup.exe,这是有效的。
但是,通过chef-solo 在客户机上运行完全相同的脚本失败,并出现 InvalidOperationException:无法生成临时类。
我用于测试的 Ruby 脚本和嵌入式 PowerShell 脚本是从我的 OS X 主机调用的:
require 'winrm'
endpoint = 'http://localhost:5985/wsman'
user = password = 'vagrant'
ps = <<EOH
function ps-runas ([String] $cmd, [String] $arguments)
{
Write-Host "ps-runas cmd: $cmd"
Write-Host "ps-runas args: $arguments"
$secpasswd = ConvertTo-SecureString "vagrant" -AsPlainText -Force
$process = New-Object System.Diagnostics.Process
$setup = $process.StartInfo
$setup.FileName = $cmd
$setup.Arguments = $arguments
$setup.UserName = "vagrant"
$setup.Password = $secpasswd
$setup.Verb = "runas"
$setup.UseShellExecute = $false
$setup.RedirectStandardError = $true
$setup.RedirectStandardOutput = $true
$setup.RedirectStandardInput = $false
# Hook into the standard output and error stream events
$errEvent = Register-ObjectEvent -InputObj $process `
-Event "ErrorDataReceived" `
-Action `
{
param
(
[System.Object] $sender,
[System.Diagnostics.DataReceivedEventArgs] $e
)
Write-Host $e.Data
}
$outEvent = Register-ObjectEvent -InputObj $process `
-Event "OutputDataReceived" `
-Action `
{
param
(
[System.Object] $sender,
[System.Diagnostics.DataReceivedEventArgs] $e
)
Write-Host $e.Data
}
Write-Host "ps-runas starting: $cmd"
if (!$process.Start())
{
Write-Error "Failed to start $cmd"
}
$process.BeginOutputReadLine()
$process.BeginErrorReadLine()
# Wait until process exit
$process.WaitForExit()
$process.CancelOutputRead()
$process.CancelErrorRead()
$process.Close()
}
EOH
cmd = ps
# Fails - Running through chef-solo fails - cannot compile a serialization assembly
cmd << "ps-runas \"c:\\opscode\\chef\\bin\\chef-solo.bat\" \"-c c:\\tmp\\vagrant-chef-1\\solo.rb -j c:\\tmp\\vagrant-chef-1\\dna.json\""
# Succeeds - Running setup directly works
#cmd << "ps-runas \"c:\\vagrant\\sql2008r2\\setup.exe\" \"/Q /ConfigurationFile=c:\\vagrant\\ConfigurationFile.ini\""
winrm = WinRM::WinRMWebService.new(endpoint, :plaintext, :user => user, :pass => password, :basic_auth_only => true)
winrm.set_timeout(60*20)
winrm.powershell(cmd) do |stdout, stderr|
STDOUT.print stdout
STDERR.print stderr
end
puts 'Done!'
从 sql 安装日志:
013-03-03 22:44:50 Slp: Exception type: Microsoft.SqlServer.Chainer.Infrastructure.ChainerInfrastructureException
2013-03-03 22:44:50 Slp: Message:
2013-03-03 22:44:50 Slp: Unable to generate a temporary class (result=1).
2013-03-03 22:44:50 Slp: error CS0583: Internal Compiler Error (0xc0000017 at address 000007FEFD00AA7D): likely culprit is 'IMPORT'.
2013-03-03 22:44:50 Slp: error CS0584: Internal Compiler Error: stage 'IMPORT' symbol 'System.Xml.Serialization.XmlSerializationReader'
2013-03-03 22:44:50 Slp: error CS0584: Internal Compiler Error: stage 'IMPORT' symbol 'Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderClusterNodesStatusPublicConfigObject'
2013-03-03 22:44:50 Slp: error CS0584: Internal Compiler Error: stage 'PREPARE' symbol 'Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderClusterNodesStatusPublicConfigObject'
2013-03-03 22:44:50 Slp: error CS0584: Internal Compiler Error: stage 'PREPARE' symbol 'Microsoft.Xml.Serialization.GeneratedAssembly'
2013-03-03 22:44:50 Slp: error CS0584: Internal Compiler Error: stage 'PREPARE' symbol 'Microsoft.Xml.Serialization'
2013-03-03 22:44:50 Slp: error CS0584: Internal Compiler Error: stage 'PREPARE' symbol 'Microsoft.Xml'
2013-03-03 22:44:50 Slp: error CS0584: Internal Compiler Error: stage 'PREPARE' symbol 'Microsoft'
2013-03-03 22:44:50 Slp: error CS0584: Internal Compiler Error: stage 'PREPARE' symbol '<global namespace>'
2013-03-03 22:44:50 Slp: error CS0586: Internal Compiler Error: stage 'PREPARE'
2013-03-03 22:44:50 Slp: error CS0587: Internal Compiler Error: stage 'PREPARE'
2013-03-03 22:44:50 Slp: error CS0587: Internal Compiler Error: stage 'BEGIN'
2013-03-03 22:44:50 Slp:
2013-03-03 22:44:50 Slp: Stack:
2013-03-03 22:44:50 Slp: at Microsoft.SqlServer.Chainer.Infrastructure.DataStoreService.DeserializeObject(String rootPath, Type type, String elementXPath)
2013-03-03 22:44:50 Slp: at Microsoft.SqlServer.Chainer.Infrastructure.DataStoreService.DeserializeObject(String rootPath, Type type)
2013-03-03 22:44:50 Slp: at Microsoft.SqlServer.Configuration.SetupExtension.FinalCalculateSettingsAction.ExecuteAction(String actionId)
2013-03-03 22:44:50 Slp: at Microsoft.SqlServer.Chainer.Infrastructure.Action.Execute(String actionId, TextWriter errorStream)
2013-03-03 22:44:50 Slp: at Microsoft.SqlServer.Setup.Chainer.Workflow.ActionInvocation.ExecuteActionHelper(TextWriter statusStream, ISequencedAction actionToRun)
2013-03-03 22:44:50 Slp: Inner exception type: System.InvalidOperationException
2013-03-03 22:44:50 Slp: Message:
2013-03-03 22:44:50 Slp: Unable to generate a temporary class (result=1).
2013-03-03 22:44:50 Slp: error CS0583: Internal Compiler Error (0xc0000017 at address 000007FEFD00AA7D): likely culprit is 'IMPORT'.
2013-03-03 22:44:50 Slp: error CS0584: Internal Compiler Error: stage 'IMPORT' symbol 'System.Xml.Serialization.XmlSerializationReader'
2013-03-03 22:44:50 Slp: error CS0584: Internal Compiler Error: stage 'IMPORT' symbol 'Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderClusterNodesStatusPublicConfigObject'
2013-03-03 22:44:50 Slp: error CS0584: Internal Compiler Error: stage 'PREPARE' symbol 'Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderClusterNodesStatusPublicConfigObject'
2013-03-03 22:44:50 Slp: error CS0584: Internal Compiler Error: stage 'PREPARE' symbol 'Microsoft.Xml.Serialization.GeneratedAssembly'
2013-03-03 22:44:50 Slp: error CS0584: Internal Compiler Error: stage 'PREPARE' symbol 'Microsoft.Xml.Serialization'
2013-03-03 22:44:50 Slp: error CS0584: Internal Compiler Error: stage 'PREPARE' symbol 'Microsoft.Xml'
2013-03-03 22:44:50 Slp: error CS0584: Internal Compiler Error: stage 'PREPARE' symbol 'Microsoft'
2013-03-03 22:44:50 Slp: error CS0584: Internal Compiler Error: stage 'PREPARE' symbol '<global namespace>'
2013-03-03 22:44:50 Slp: error CS0586: Internal Compiler Error: stage 'PREPARE'
2013-03-03 22:44:50 Slp: error CS0587: Internal Compiler Error: stage 'PREPARE'
2013-03-03 22:44:50 Slp: error CS0587: Internal Compiler Error: stage 'BEGIN'
2013-03-03 22:44:50 Slp:
2013-03-03 22:44:50 Slp: Stack:
2013-03-03 22:44:50 Slp: at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence)
2013-03-03 22:44:50 Slp: at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters parameters, Assembly assembly, Hashtable assemblies)
2013-03-03 22:44:50 Slp: at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence)
2013-03-03 22:44:50 Slp: at System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace)
2013-03-03 22:44:50 Slp: at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
2013-03-03 22:44:50 Slp: at Microsoft.SqlServer.Chainer.Infrastructure.DataStoreService.DeserializeObject(String rootPath, Type type, String elementXPath)
我的第一个怀疑是我的临时目录遇到了某种权限问题,但是我尝试运行 ProcMon 并且在运行设置时没有发现任何 ACCESS DENIED 结果。此外,由于 PowerShell 脚本和 UAC 已关闭,我明确地以本地管理员 (vagrant) 身份运行。