当通过chef-solo on vagrant时,SQL Server安装失败并显示"无法生成临时类"

Sne*_*eal 6 sql-server powershell chef-infra vagrant winrm

在过去的一周里,我一直在努力解决厨师COOK-1172的问题但没有取得多大成功.我正在尝试使用Chef-Solo配置程序通过Vagrant安装SQL Server 2008 R2 Developer Edition(在我的情况下).

我已经能够通过直接通过Ruby WinRM gem重现Chef之外的问题,然后使用自定义PowerShell脚本修复它,该脚本使用传递的凭据在guest虚拟机Windows vagrant框上启动setup.exe进程.换句话说,WinRM gem调用一个远程PS脚本,该脚本在指定的凭据下启动SQL Server setup.exe,这是有效的.

但是,通过 guest-solo在guest虚拟机上运行相同的完全脚本失败,并出现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!'
Run Code Online (Sandbox Code Playgroud)

从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)
Run Code Online (Sandbox Code Playgroud)

我的第一个怀疑是我在我的临时目录中遇到了某种权限问题,但是我尝试运行ProcMon并且在运行安装程序时没有找到任何访问被拒绝的结果.此外,由于PowerShell脚本和UAC已关闭,我明确地作为本地管理员(vagrant)运行.

Sne*_*eal 4

我可能会列出我所做的很多事情来追踪这个问题,但最终我发现失败并不是特定于通过 Chef 甚至 Ruby 运行安装程序。本质上,每当我使用另一个进程通过WinRM安装 SQL Server 时,甚至 PowerShell 都会出错,这会在安装程序日志中产生 OutOfMemoryException。

这最终让我想知道通过 WinRM 执行安装程序有什么不同。然后我有了一个想法。如果我是 Microsoft,我可能会在 WinRM 周围提供一些企业功能,以限制服务器上的攻击面。显然 WinRM 有一个称为配额管理的功能。

简而言之,修改 Windows 来宾虚拟机的本地组策略解决了问题,我终于能够通过 WinRM 和 Chef(使用上面的 PS 脚本)成功安装 SQL Server。以下是我使用的设置:

控制台根目录| 本地计算机政策| 电脑配置| 管理模板| Windows 组件 | Windows 远程外壳

  • 最大并发用户数:100
  • 每个Shell 最大内存MB: 0
  • 每个 Shell 最大进程数:0
  • 每个用户的最大壳数:0