Установка SQL Server завершается с ошибкой "невозможно создать временный класс", когда через chef-solo на vagrant

за последнюю неделю я пытался обратиться повар повар-1172 без особого успеха. Я пытаюсь установить SQL Server 2008 R2 Developer Edition (в моем случае) через Vagrant, используя Chef-Solo provisioner.

я смог воспроизвести проблему вне Chef, перейдя непосредственно через Ruby WinRM gem, а затем исправить ее с помощью пользовательского сценария PowerShell, который использует переданные учетные данные для запуска установки.exe процесс на гостевой Windows vagrant коробка. Другими словами, WinRM gem вызывает удаленный скрипт PS, который запускает установку SQL Server.исполняемые под указанными учетными данными, и это работает.

однако, работает тот же самый точный скрипт через шеф-повар-соло на гостевой сбой с 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:opscodechefbinchef-solo.bat" "-c c:tmpvagrant-chef-1solo.rb -j c:tmpvagrant-chef-1dna.json""

# Succeeds - Running setup directly works
#cmd << "ps-runas "c:vagrantsql2008r2setup.exe" "/Q /ConfigurationFile=c:vagrantConfigurationFile.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 и не нашел никаких результатов отказа в доступе во время запуска установки. Кроме того, я явно работаю как локальный администратор (vagrant) из-за сценария PowerShell, и UAC отключен.

4 ответов


Я мог бы потенциально перечислить много вещей, которые я сделал, чтобы отследить это, но в конце концов я обнаружил, что сбой не был специфичным для запуска установщика через Chef или даже Ruby. По сути, это будет ошибка в любое время, когда я использовал другой процесс для установки SQL Server через WinRM, даже PowerShell, который создаст исключение OutOfMemoryException в журналах установщика.

Это в конечном итоге заставило меня задаться вопросом, Что изменилось в выполнении установщика через WinRM. Потом мне пришла в голову мысль. Если бы я был Microsoft, у меня, вероятно, были бы некоторые функции enterprisey вокруг WinRM, которые ограничивали эту поверхность атаки на сервере. По-видимому, WinRM имеет функцию Управление Квотами.

короче говоря, изменение локальной групповой политики моей гостевой виртуальной машины Windows исправило проблему, и я, наконец, смог успешно установить SQL Server через WinRM и Chef (с моим сценарием PS выше). Вот настройки, которые я использовал:

Корень Консоли / Политика Локального Компьютера / Конфигурация Компьютера | Административные Шаблоны / Компоненты Windows / Удаленная Оболочка Windows

  • MaxConcurrentUsers: 100
  • MaxMemoryPerShellMB: 0
  • MaxProcessesPerShell: 0
  • MaxShellsPerUser: 0

У меня также была эта проблема с установкой sql server через DSC на сервере 2016 (и, вероятно, более старые версии)

вы также можете установить эту опцию через powershell напрямую:

set-item WSMan:\localhost\Shell\MaxMemoryPerShellMB 2048

от этого билет шеф-повар Кук-1172, Julian C. Dunn [Chef] добавил комментарий

мы считаем, что теперь это исправлено Microsoft в следующем исправлении, которое восстановит уважение WinRM к MaxMemoryPerShellMB: http://support.microsoft.com/kb/2842230

к сожалению, это не работает для меня. У меня все та же проблема.


проведя много дней в погоне за этим, я обнаружил, что основной причиной в моем случае было то, что, когда я включил какой-либо пароль в файл unattend, он не удался при установке через WinRM.

Это можно решить с помощью CredSSP