Hi,
I dug through the posts here and the open issues on github, but can't find this specific problem. The only bug I found that might have to do with this is:
https://github.com/mitchellh/vagrant/issues/5313 (saltstack bootstrap script is always downloaded and run on provision, regardless it is installed already or not).
So here goes:
provider: VirtualBox
Host: Linux (Ubuntu 14.04)
Guest: Windows Server 2008 R2
Vagrantfile: (see end of this post)
Now I am trying to add provisioning with salt and I get this error on running salt.
############### (hopefully) relevant part of debug log from first vagrant up ####################
==> default: Running provisioner: salt...
INFO environment: Running hook: provisioner_run
INFO runner: Preparing hooks for middleware sequence...
INFO runner: 1 hooks defined.
INFO runner: Running action: #<Method: Vagrant::Action::Builtin::Provision#run_provisioner>
INFO warden: Calling IN action: #<Proc:0x007f8e40a1d800@/opt/vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/action/warden.rb:94 (lambda)>
INFO interface: info: Copying salt minion config to vm.
Copying salt minion config to vm.
INFO winrm: Uploading: /home/obestwalter/work/prodenv/vagrant_winbox/salt/minion to C:\tmp/minion
DEBUG filemanager: Upload: /home/obestwalter/work/prodenv/vagrant_winbox/salt/minion -> C:\tmp/minion
DEBUG winrmshell: powershell executing:
$dest_file_path = [System.IO.Path]::GetFullPath('C:\tmp/minion')
if (Test-Path $dest_file_path) {
$crypto_provider = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
try {
$file = [System.IO.File]::Open($dest_file_path, [System.IO.Filemode]::Open, [System.IO.FileAccess]::Read)
$guest_md5 = ([System.BitConverter]::ToString($crypto_provider.ComputeHash($file))).Replace("-","").ToLower()
}
finally {
$file.Dispose()
}
if ($guest_md5 -eq 'b3093528507e3684b1ed4623e449848c') {
exit 0
}
}
Write-Host "should upload file $dest_file_path"
exit 1
if ($?) { exit 0 } else { if($LASTEXITCODE) { exit $LASTEXITCODE } else { exit 1 } }
DEBUG winrmshell: Output: {:data=>[{:stdout=>"should upload file C:\\tmp\\minion"}, {:stdout=>"\n"}], :exitcode=>1}
DEBUG winrmshell: cmd executing:
echo %TEMP%
DEBUG winrmshell: Output: {:data=>[{:stdout=>"C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\r\n"}], :exitcode=>0}
DEBUG filemanager: Uploading '/home/obestwalter/work/prodenv/vagrant_winbox/salt/minion' to temp file 'C:\Users\ADMINI~1\AppData\Local\Temp/winrm-upload-0.7808051803959843'
DEBUG winrmshell: cmd executing:
echo IyBXQVJOSU5HIFRISVMgQ09ORklHIElTIEpVU1QgRk9SIFZBR1JBTlQhCgpmaWxlX2NsaWVudDogbG9jYWwKbG9nX2xldmVsOiBpbmZvCnN0YXRlX291dHB1dDogbWl4ZWQKCg== >> "C:\Users\ADMINI~1\AppData\Local\Temp/winrm-upload-0.7808051803959843"
DEBUG winrmshell: Output: {:data=>[], :exitcode=>0}
DEBUG filemanager: Decoding temp file 'C:\Users\ADMINI~1\AppData\Local\Temp/winrm-upload-0.7808051803959843' to 'C:\tmp/minion'
DEBUG winrmshell: powershell executing:
$tmp_file_path = [System.IO.Path]::GetFullPath('C:\Users\ADMINI~1\AppData\Local\Temp/winrm-upload-0.7808051803959843')
$dest_file_path = [System.IO.Path]::GetFullPath('C:\tmp/minion')
if (Test-Path $dest_file_path) {
rm $dest_file_path
}
else {
$dest_dir = ([System.IO.Path]::GetDirectoryName($dest_file_path))
New-Item -ItemType directory -Force -Path $dest_dir
}
$base64_string = Get-Content $tmp_file_path
$bytes = [System.Convert]::FromBase64String($base64_string)
[System.IO.File]::WriteAllBytes($dest_file_path, $bytes)
if ($?) { exit 0 } else { if($LASTEXITCODE) { exit $LASTEXITCODE } else { exit 1 } }
DEBUG winrmshell: Output: {:data=>[{:stdout=>"\r\n"}, {:stdout=>"\r\n"}, {:stdout=>" Directory: C:\\"}, {:stdout=>"\r\n\r\n\r\n"}, {:stdout=>"Mode LastWriteTime Length Name \r\n"}, {:stdout=>"---- ------------- ------ ---- \r\nd---- 13.04.2015 14:34 tmp \r\n"}], :exitcode=>0}
INFO interface: info: Checking if C:\salt\salt-minion.exe is installed
Checking if C:\salt\salt-minion.exe is installed
DEBUG winrmshell: powershell executing:
$command = [Array](Get-Command C:\salt\salt-minion.exe -errorAction SilentlyContinue)
if ($null -eq $command) { exit 1 }
write-host $command[0].Definition
exit 0
if ($?) { exit 0 } else { if($LASTEXITCODE) { exit $LASTEXITCODE } else { exit 1 } }
DEBUG winrmshell: Output: {:data=>[], :exitcode=>1}
INFO interface: info: C:\salt\salt-minion.exe was not found.
C:\salt\salt-minion.exe was not found.
INFO interface: info: Checking if C:\salt\salt-call.exe is installed
Checking if C:\salt\salt-call.exe is installed
DEBUG winrmshell: powershell executing:
$command = [Array](Get-Command C:\salt\salt-call.exe -errorAction SilentlyContinue)
if ($null -eq $command) { exit 1 }
write-host $command[0].Definition
exit 0
if ($?) { exit 0 } else { if($LASTEXITCODE) { exit $LASTEXITCODE } else { exit 1 } }
DEBUG winrmshell: Output: {:data=>[], :exitcode=>1}
INFO interface: info: C:\salt\salt-call.exe was not found.
C:\salt\salt-call.exe was not found.
INFO interface: info: Bootstrapping Salt... (this may take a while)
Bootstrapping Salt... (this may take a while)
DEBUG winrmshell: powershell executing:
$p = "C:\tmp/bootstrap_salt.ps1"
if ((Test-Path $p) -and (!(get-item $p).PSIsContainer)) {
exit 0
}
exit 1
if ($?) { exit 0 } else { if($LASTEXITCODE) { exit $LASTEXITCODE } else { exit 1 } }
DEBUG winrmshell: Output: {:data=>[], :exitcode=>1}
INFO winrm: Uploading: /opt/vagrant/embedded/gems/gems/vagrant-1.7.2/plugins/provisioners/salt/bootstrap-salt.ps1 to C:\tmp/bootstrap_salt.ps1
DEBUG filemanager: Upload: /opt/vagrant/embedded/gems/gems/vagrant-1.7.2/plugins/provisioners/salt/bootstrap-salt.ps1 -> C:\tmp/bootstrap_salt.ps1
DEBUG winrmshell: powershell executing:
$dest_file_path = [System.IO.Path]::GetFullPath('C:\tmp/bootstrap_salt.ps1')
if (Test-Path $dest_file_path) {
$crypto_provider = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
try {
$file = [System.IO.File]::Open($dest_file_path, [System.IO.Filemode]::Open, [System.IO.FileAccess]::Read)
$guest_md5 = ([System.BitConverter]::ToString($crypto_provider.ComputeHash($file))).Replace("-","").ToLower()
}
finally {
$file.Dispose()
}
if ($guest_md5 -eq 'c7d8762ae87333a423f1d68b2e08f585') {
exit 0
}
}
Write-Host "should upload file $dest_file_path"
exit 1
if ($?) { exit 0 } else { if($LASTEXITCODE) { exit $LASTEXITCODE } else { exit 1 } }
DEBUG winrmshell: Output: {:data=>[{:stdout=>"should upload file C:\\tmp\\bootstrap_salt.ps1"}, {:stdout=>"\n"}], :exitcode=>1}
DEBUG winrmshell: cmd executing:
echo %TEMP%
DEBUG winrmshell: Output: {:data=>[{:stdout=>"C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\r\n"}], :exitcode=>0}
DEBUG filemanager: Uploading '/opt/vagrant/embedded/gems/gems/vagrant-1.7.2/plugins/provisioners/salt/bootstrap-salt.ps1' to temp file 'C:\Users\ADMINI~1\AppData\Local\Temp/winrm-upload-0.29892565979715235'
DEBUG winrmshell: cmd executing:
echo IyBTYWx0IHZlcnNpb24gdG8gaW5zdGFsbAokdmVyc2lvbiA9ICcyMDE0LjEuMTAnCgojIENyZWF0ZSBDOlx0bXBcIC0gaWYgVmFncmFudCBkb2Vzbid0IHVwbG9hZCBrZXlzIGFuZC9vciBjb25maWcgaXQgbWlnaHQgbm90IGV4aXN0Ck5ldy1JdGVtIEM6XHRtcFwgLUl0ZW1UeXBlIGRpcmVjdG9yeSB8IG91dC1udWxsCgojIENvcHkgbWluaW9uIGtleXMgJiBjb25maWcgdG8gY29ycmVjdCBsb2NhdGlvbgpOZXctSXRlbSBDOlxzYWx0XGNvbmZccGtpXG1pbmlvblwgLUl0ZW1UeXBlIGRpcmVjdG9yeSB8IG91dC1udWxsCgojIENoZWNrIGlmIG1pbmlvbiBrZXlzIGhhdmUgYmVlbiB1cGxvYWRlZAppZiAoVGVzdC1QYXRoIEM6XHRtcFxtaW5pb24ucGVtKSB7CiAgY3AgQzpcdG1wXG1pbmlvbi5wZW0gQzpcc2FsdFxjb25mXHBraVxtaW5pb25cCiAgY3AgQzpcdG1wXG1pbmlvbi5wdWIgQzpcc2FsdFxjb25mXHBraVxtaW5pb25cCn0KCiMgQ2hlY2sgaWYgbWluaW9uIGNvbmZpZyBoYXMgYmVlbiB1cGxvYWRlZAppZiAoVGVzdC1QYXRoIEM6XHRtcFxtaW5pb24pIHsKICBjcCBDOlx0bXBcbWluaW9uIEM6XHNhbHRcY29uZlwKfQoKIyBEZXRlY3QgYXJjaGl0ZWN0dXJlCmlmIChbSW50UHRyXTo6U2l6ZSAtZXEgNCkgewogICRhcmNoID0gIndpbjMyIgp9IGVsc2UgewogICRhcmNoID0gIkFNRDY0Igp9CgojIERvd25sb2FkIG1pbmlvbiBzZXR1cCBmaWxlCldyaXRlLUhvc3QgIkRvd25sb2FkaW5nIFNhbHQgbWluaW9uIGluc3RhbGxlciAoJGFyY2gpLi4uIgokd2ViY2xpZW50ID0gTmV3LU9iamVjdCBTeXN0ZW0uTmV0LldlYkNsaWVudAokdXJsID0gImh0dHBzOi8vZG9jcy5zYWx0c3RhY2suY29tL2Rvd25sb2Fkcy9TYWx0LU1pbmlvbi0kdmVyc2lvbi0kYXJjaC1TZXR1cC5leGUiCiRmaWxlID0gIkM6XHRtcFxzYWx0LmV4ZSIKJHdlYmNsaWVudC5Eb3dubG9hZEZpbGUoJHVybCwgJGZpbGUpCgojIEluc3RhbGwgbWluaW9uIHNpbGVudGx5CldyaXRlLUhvc3QgIkluc3RhbGxpbmcgU2FsdCBtaW5pb24uLi4iCkM6XHRtcFxzYWx0LmV4ZSAvUwoKIyBXYWl0IGZvciBzYWx0LW1pbmlvbiBzZXJ2aWNlIHRvIGJlIHJlZ2lzdGVyZWQgYmVmb3JlIHRyeWluZyB0byBzdGFydCBpdAokc2VydmljZSA9IEdldC1TZXJ2aWNlIHNhbHQtbWluaW9uIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlCldoaWxlICghJHNlcnZpY2UpIHsKICBTdGFydC1TbGVlcCAtcyAyCiAgJHNlcnZpY2UgPSBHZXQtU2VydmljZSBzYWx0LW1pbmlvbiAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQp9CgojIFN0YXJ0IHNlcnZpY2UKU3RhcnQtU2VydmljZSAtTmFtZSAic2FsdC1taW5pb24iIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlCgojIENoZWNrIGlmIHNlcnZpY2UgaXMgc3RhcnRlZCwgb3RoZXJ3aXNlIHJldHJ5IHN0YXJ0aW5nIHRoZSAKIyBzZXJ2aWNlIDQgdGltZXMuCiR0cnkgPSAwCldoaWxlICgoJHNlcnZpY2UuU3RhdHVzIC1uZSAiUnVubmluZyIpIC1hbmQgKCR0cnkgLW5lIDQpKSB7CiAgU3RhcnQtU2VydmljZSAtTmFtZSAic2FsdC1taW5pb24iIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlCiAgJHNlcnZpY2UgPSBHZXQtU2VydmljZSBzYWx0LW1pbmlvbiAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogIFN0YXJ0LVNsZWVwIC1zIDIKICAkdHJ5ICs9IDEKfQoKIyBJZiB0aGUgc2FsdC1taW5pb24gc2VydmljZSBpcyBzdGlsbCBub3QgcnVubmluZywgc29tZXRoaW5nIHByb2JhYmx5CiMgd2VudCB3cm9uZyBhbmQgdXNlciBpbnRlcnZlbnRpb24gaXMgcmVxdWlyZWQgLSByZXBvcnQgZmFpbHVyZS4KaWYgKCRzZXJ2aWNlLlN0YXR1cyAtZXEgIlN0b3BwZWQiKSB7CiAgV3JpdGUtSG9zdCAiRmFpbGVkIHRvIHN0YXJ0IFNhbHQgbWluaW9uIgogIGV4aXQgMQp9CgpXcml0ZS1Ib3N0ICJTYWx0IG1pbmlvbiBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkIgo= >> "C:\Users\ADMINI~1\AppData\Local\Temp/winrm-upload-0.29892565979715235"
DEBUG winrmshell: Output: {:data=>[], :exitcode=>0}
DEBUG filemanager: Decoding temp file 'C:\Users\ADMINI~1\AppData\Local\Temp/winrm-upload-0.29892565979715235' to 'C:\tmp/bootstrap_salt.ps1'
DEBUG winrmshell: powershell executing:
$tmp_file_path = [System.IO.Path]::GetFullPath('C:\Users\ADMINI~1\AppData\Local\Temp/winrm-upload-0.29892565979715235')
$dest_file_path = [System.IO.Path]::GetFullPath('C:\tmp/bootstrap_salt.ps1')
if (Test-Path $dest_file_path) {
rm $dest_file_path
}
else {
$dest_dir = ([System.IO.Path]::GetDirectoryName($dest_file_path))
New-Item -ItemType directory -Force -Path $dest_dir
}
$base64_string = Get-Content $tmp_file_path
$bytes = [System.Convert]::FromBase64String($base64_string)
[System.IO.File]::WriteAllBytes($dest_file_path, $bytes)
if ($?) { exit 0 } else { if($LASTEXITCODE) { exit $LASTEXITCODE } else { exit 1 } }
DEBUG winrmshell: Output: {:data=>[{:stdout=>"\r\n"}, {:stdout=>"\r\n"}, {:stdout=>" Directory: C:\\"}, {:stdout=>"\r\n\r\n\r\n"}, {:stdout=>"Mode LastWriteTime Length Name "}, {:stdout=>"\r\n---- ------------- ------ ---- \r\n"}, {:stdout=>"d---- 13.04.2015 14:34 tmp \r\n"}], :exitcode=>0}
DEBUG winrmshell: powershell executing:
powershell.exe -executionpolicy bypass -file C:\tmp/bootstrap_salt.ps1
if ($?) { exit 0 } else { if($LASTEXITCODE) { exit $LASTEXITCODE } else { exit 1 } }
DEBUG winrmshell: Output: {:data=>[{:stderr=>"New-Item : Item with specified name C:\\tmp\\ already exists.\r\n"}, {:stderr=>"At C:\\tmp\\bootstrap_salt.ps1:5 char:9\r\n"}, {:stderr=>"+ New-Item <<<< C:\\tmp\\ -ItemType directory | out-null\r\n + CategoryInfo : ResourceExists: (C:\\tmp\\:String) [New-Item], IOE \r\n xception\r\n + FullyQualifiedErrorId : DirectoryExist,
Microsoft.PowerShell.Commands.New \r\n ItemCommand\r\n \r\n"}, {:stdout=>"Downloading Salt minion installer (AMD64)..."}, {:stdout=>"\n"}, {:stdout=>"Installing Salt minion..."}, {:stdout=>"\n"}, {:stdout=>"Failed to start Salt minion"}, {:stdout=>"\n"}], :exitcode=>1}
ERROR warden: Error occurred: The following WinRM command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
powershell.exe -executionpolicy bypass -file C:\tmp/bootstrap_salt.ps1
if ($?) { exit 0 } else { if($LASTEXITCODE) { exit $LASTEXITCODE } else { exit 1 } }
Stdout from the command:
Stderr from the command:
New-Item : Item with specified name C:\tmp\ already exists.
At C:\tmp\bootstrap_salt.ps1:5 char:9
+ New-Item <<<< C:\tmp\ -ItemType directory | out-null
+ CategoryInfo : ResourceExists: (C:\tmp\:String) [New-Item], IOE
xception
ItemCommand
INFO warden: Beginning recovery process...
INFO warden: Recovery complete.
ERROR warden: Error occurred: The following WinRM command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
powershell.exe -executionpolicy bypass -file C:\tmp/bootstrap_salt.ps1
if ($?) { exit 0 } else { if($LASTEXITCODE) { exit $LASTEXITCODE } else { exit 1 } }
Stdout from the command:
Stderr from the command:
New-Item : Item with specified name C:\tmp\ already exists.
At C:\tmp\bootstrap_salt.ps1:5 char:9
+ New-Item <<<< C:\tmp\ -ItemType directory | out-null
+ CategoryInfo : ResourceExists: (C:\tmp\:String) [New-Item], IOE
xception
ItemCommand
INFO warden: Beginning recovery process...
INFO warden: Calling recover: #<Vagrant::Action::Builtin::HandleForwardedPortCollisions:0x00000001550a68>
INFO warden: Recovery complete.
INFO warden: Beginning recovery process...
INFO warden: Recovery complete.
INFO warden: Beginning recovery process...
INFO warden: Recovery complete.
INFO warden: Beginning recovery process...
INFO warden: Recovery complete.
INFO warden: Beginning recovery process...
INFO warden: Recovery complete.
[...] etc. (runs into this error several times, before giving up)
############################### Vagrantfile ####################################
Vagrant.configure("2") do |config|
config.vm.box = "w2k8_r2_base"
config.vm.communicator = "winrm"
config.winrm.username = "Administrator"
config.winrm.password = "Vagrant123"
config.vm.network "forwarded_port", guest: 3389, host: 33389, id: "rdp", auto_correct: true
config.vm.provider :virtualbox do |v, override|
v.customize ["modifyvm", :id, "--memory", 2048]
v.customize ["modifyvm", :id, "--cpus", 2]
end
config.vm.synced_folder ".", "C:/salt/srv/salt/"
config.vm.provision :salt do |salt|
salt.minion_config = "salt/minion"
salt.run_highstate = true
end
end
############################### Vagrantfile ####################################