2016-01-07 2 views
3

Я пытаюсь автоматизировать создание среды разработки Windows 7 с использованием Packer (v.0.8.6), Vagrant (v.1.8.1), VirtualBox (v.5.0.10) и Chocolatey (v.0.9.9.11) на хосте Windows 8.1.Почему Chocolatey не удается установить при настройке виртуальной машины Windows 7 с использованием Vagrant?

Мне удалось создать базовую коробку Windows 7 SP1 с использованием Packer, и я пытаюсь создать виртуальную машину с помощью Vagrant, используя vagrant up. Первое, что я хочу сделать, это установить Chocolatey, чтобы я мог легко предоставить другое программное обеспечение.

Однако. Я был безуспешным в этом. Я пробовал различные заклинания в моем Vagrantfile. Вот содержание.

# -*- mode: ruby -*- 
# vi: set ft=ruby : 
Vagrant.configure(2) do |config| 
    config.vm.box = "windows_7" 
    config.vm.provider "virtualbox" do |vb| 
    # Display the VirtualBox GUI when booting the machine 
    vb.gui = true 
    end 

    # option 1 
    # config.vm.provision "shell", "inline": "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" 

    # option 2 
    # config.vm.provision "shell", "path": "./scripts/install-chocolatey.cmd" 

    # option 3 
    # config.vm.provision "shell", path: "./scripts/install-chocolatey.ps1" 
end 

# ./scripts/install-chocolatey.cmd 
@powershell -NoProfile -ExecutionPolicy Bypass -File "%systemdrive%\vagrant\scripts\install-chocolatey.ps1" 

# ./scripts/install-chocolatey.ps1 
iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1')) 

Ошибка, которую я получил для любого из этих вариантов:

==> default: Everything is Ok 
==> default: 
==> default: Files: 76 
==> default: Size:  4893948 
==> default: Compressed: 1806765 
==> default: out-lineoutput : The OS handle's position is not what FileStream expected. Do n 
==> default: ot use a handle simultaneously in one FileStream and in Win32 code or another F 
==> default: ileStream. This may cause data loss. 
==> default:  + CategoryInfo   : NotSpecified: (:) [out-lineoutput], IOException 
==> default:  + FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Comma 
==> default: nds.OutLineOutputCommand 
==> default: 

Однако, если я вручную запускаю либо вариант 1, 2, либо 3 из окна Cmd или PowerShell на виртуальной машине, то шоколадно устанавливается нормально.

Я искал эту ошибку онлайн и, похоже, PowerShell 2 and 3 bug. Действительно, если я вручную установлю PowerShell 4 на виртуальной машине и запустил vagrant provision, чтобы повторно установить его, эти параметры работают.

Но если это так, то почему я могу установить шоколад вручную, но не через Vagrant? Я хотел бы использовать chocolately для обновления PowerShell, так как было бы намного проще сделать это автоматическим способом.

Как я могу обучить Vagrant установке Chocolatey на моей виртуальной машине без предварительной модернизации PowerShell до более новой версии?


Обход Попытка 1:

Я попытался понижая VirtualBox от 5.0.10 до 4.3.28, чтобы узнать, есть ли проблема (по рекомендации). Однако мне не удалось запустить 4.3.28 на моем хост-компьютере, так как я получил ошибку при попытке создать новую виртуальную машину, даже из коробки, без упаковщика или бродяг. Переустановка 5.0.10 решила эту проблему.


Обход Покушение 2:

Я применил Powershell 2 обходной скрипт defined here моей установки-chocolatey.ps1 сценария. Полное содержание затем стали:

$bindingFlags = [Reflection.BindingFlags] "Instance,NonPublic,GetField" 
$objectRef = $host.GetType().GetField("externalHostRef", $bindingFlags).GetValue($host) 

$bindingFlags = [Reflection.BindingFlags] "Instance,NonPublic,GetProperty" 
$consoleHost = $objectRef.GetType().GetProperty("Value", $bindingFlags).GetValue($objectRef, @()) 

[void] $consoleHost.GetType().GetProperty("IsStandardOutputRedirected", $bindingFlags).GetValue($consoleHost, @()) 
$bindingFlags = [Reflection.BindingFlags] "Instance,NonPublic,GetField" 
$field = $consoleHost.GetType().GetField("standardOutputWriter", $bindingFlags) 
$field.SetValue($consoleHost, [Console]::Out) 
$field2 = $consoleHost.GetType().GetField("standardErrorWriter", $bindingFlags) 
$field2.SetValue($consoleHost, [Console]::Out) 

iex -Debug ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1')) 

Это позволило шоколадным установить. Тем не менее, я не могу выдать choco заявления от поставщиков Vagrant или из строки cmd или окна PowerShell, пока я не перезагружу компьютер. Однако после перезагрузки они становятся доступными, однако это приводит к сбою инициализации.Я понимаю, что мне не нужно перезагружать машину, чтобы использовать Chocolatey. Мне нужно только перезагрузить оболочку. Проверяя переменную PATH, я вижу, что Chocolatey не добавлен в PATH, что объясняет проблему.

+0

Возможно, что обходное решение Ли Холмса должно быть продвинуто в резервное хранилище запасных частей. Я могу установить Chocolatey прямо с гостевой консоли PowerShell, без проблем. –

ответ

0

Таким образом, вы видите сообщение об ошибке PowerShell, когда есть журнал для одного потока (например, stdout), за которым следует журнал в другой поток (например, stderr), обычно включающий запись вывода в путь к файлу.

Произошла ошибка, но, к сожалению, PowerShell проглатывает ее и воспроизводит другие проблемы - вы можете добавить $env:ChocolateyDebug перед вызовом для установки Chocolatey и посмотреть, помогает ли она указать, где происходит ошибка.

Если бы я должен был предположить, что это, скорее всего, связано с Chocolatey, пытающимся установить .NET Framework 4.0 и запускаясь в ошибки. В моем бродяжном репо я склонен отделять шаги .Net 4 от установки чего-то отдельно от Chocolatey. Это репо составляет vagrant-windows-puppet.

+0

Я добавил «$ env: ChocolateyDebug = 'true'' в файл install-chocolatey.ps1 перед установкой Chocolatey и, к сожалению, я не вижу дополнительной информации об ошибке в выходе из бродяг. Я также попробовал '$ env: ChocolatelyEnvironmentDebug = 'true''. Я также подтвердил, что на базовом изображении я установил .NET 4.0 и .NET 4.5. Chocolatey не попытался бы установить их, поскольку они уже существуют, не так ли? –

+0

Вы также можете перенаправить все выходные данные на stdout, чтобы вы не получили ошибку, но вы увидите фактическую ошибку. – ferventcoder

+0

Я попытался обернуть команду в 'Start-Transaction/Stop-Transaction'. Я также попытался перенаправить вывод через 2> & 1. Ни один из параметров не показывает мне больше информации, и я получаю такое же сообщение об ошибке на консоли через Vagrant. –