Thank you Jordan! I just tried the suggestion and it works great!  I agree,
the installer is terrible to begin with.  I initially wanted to do a
chocolatey package but it was overwhelmingly even more complex too learn
for this type of installer.  I really appreciate your help and test

On Thu, Feb 14, 2019 at 3:26 AM Jordan Borean <jborea...@gmail.com> wrote:

> I found some time to play around with this a bit more. It turns out the
> initial installer spawns multiple processes and doesn't actually wait until
> it is finished. This causes the parent WinRM process to close it's shell
> which has the side affect of killing any children it spawns.
>
> It's weird behaviour from the installer as it should be waiting until all
> the installed processes have finish before finishing but this isn't the
> case. The reason why it works when you run locally or through
> 'Enter-PSSession' is because those sessions are persistent, whereas Ansible
> and 'Invoke-Command' will close that session as soon as it's command is
> finished.
>
> Luckily using async will allow you to escape this behaviour, using the
> following playbook you can install VS and wait until the installer has
> actually completed. It uses async on the first task so that the spawned
> installer is not killed when WinRM exits and then waits until it is
> complete in the 2nd task. Become isn't needed for this task, you just need
> to escape the WinRM job boundary which is what async is for.
>
> ---
> - hosts: vagrant-windows
>   gather_facts: no
>   tasks:
>   - name: download installer
>     win_get_url:
>       url: https://
> download.visualstudio.microsoft.com/download/pr/324e8588-c90a-4229-947f-d60efec43018/0baa0fb3754413e8048d3625ddf5d585/vs_enterprise.exe
>       dest: C:\temp\vs_enterprise.exe
>       force: no
>
>   # Async is required because the installer spawns a detached process and
> doesn't wait until it is complete. Because
>   # WinRM exits it kills any child processes including the spawned
> vs_installer. By using async, we can ensure the
>   # child process continues to run in the background and is not reaped
> when WinRM exits.
>   - name: install VS Enterprise
>     win_command: c:\temp\vs_enterprise.exe --add Microsoft.VisualStudio.
> Component.CoreEditor --quiet
>     async: 60 # May need a higher timeout if the initial installer
> download takes too long
>
>   # Because the installer is running in the background, we need to wait
> until it is complete before continuing. We also
>   # set the exit code of this process to whatever the exit code is of the
> vs_installer process if found. This gives us
>   # at least some error reporting in case something went bad
>   - name: wait until process is complete
>     win_shell: |
>       $process = Get-Process -Name vs_installer -ErrorAction
> SilentlyContinue
>       if ($process) {
>           $process | Wait-Process
>           $host.SetShouldExit($process.ExitCode)
>       } else {
>           $host.SetShouldExit(0)  # Clears out any error with Get-Process
> not finding a process
>       }
>     changed_when: False
>
> Ultimately this seems like poor behaviour on the installers part but this
> is all out of Ansible's control.
>
> Thanks
>
> Jordan
>
> --
> You received this message because you are subscribed to the Google Groups
> "Ansible Development" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to ansible-devel+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to ansible-devel+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to