mk7
mk7

Reputation: 215

Issue with Packer ansible provisioner for Windows 8.1 VM in virtualbox

To provide some context regarding the setup, I am trying to spin up a Windows 8.1 (x64) VM with Packer using VirtualBox as the provider and Ansible as the provisioner, from my local Macbook. I have already tested the Windows build with Packer (without Ansible provisioner), which works successfully.

However, when I try to use ansible provisioner (not ansible-local), I am unable to do so. I have setup the Packer build as specified in packer docs for ansible: https://www.packer.io/docs/provisioners/ansible.html. I also run the ConfigureRemotingForAnsible.ps1 mentioned on http://docs.ansible.com/ansible/intro_windows.html#windows-system-prep on the first boot of Windows VM.

My tech stack versions are:

The packer.json file is as follows

{
  "builders": [
    {
      "type": "virtualbox-iso",
      "iso_url": "{{ user `iso_url` }}",
      "iso_checksum_type": "sha1",
      "iso_checksum": "{{ user `iso_checksum` }}",
      "communicator": "winrm",
      "headless": "{{ user `headless` }}",
      "boot_wait": "9m",
      "winrm_use_ssl": true,
      "winrm_insecure": true,
      "winrm_host": "127.0.0.1",
      "winrm_port": 5986,
      "winrm_username": "packer",
      "winrm_password": "packer",
      "winrm_timeout": "8h",
      "shutdown_command": "shutdown /s /t 10 /f /d p:4:1 /c \"Packer Shutdown\"",
      "guest_os_type": "Windows81_64",
      "guest_additions_mode": "disable",
      "floppy_files": [
        "./answer_files/81/Autounattend.xml",
        "./scripts/enable-winrm.ps1",
        "./scripts/ConfigureRemotingForAnsible.ps1"
      ],
      "vboxmanage": [
        [ "modifyvm", "{{.Name}}", "--natpf1", "winrm,tcp,,5986,,5986" ],
        [ "modifyvm", "{{.Name}}", "--memory", "4096" ],
        [ "modifyvm", "{{.Name}}", "--vram", "32" ],
        [ "modifyvm", "{{.Name}}", "--cpus", "2" ]
      ]
    }
  ],
  "provisioners": [
    {
      "type": "ansible",
      "playbook_file": "./provisioner/run-powershell.yml",
      "local_port": "5986",
      "user": "packer",
      "extra_arguments": [
        "-vvvv",
        "--connection", "packer",
        "--extra-vars", "ansible_shell_type=powershell ansible_shell_executable=None"
      ]
    }
  ],
  "post-processors": [
    {
      "type": "vagrant",
      "keep_input_artifact": true,
      "output": "output-formats/windows_81_{{.Provider}}.box",
      "vagrantfile_template": "vagrantfile-windows_81.template"
    }
  ],
  "variables": {
    "headless": "false",
    "iso_checksum": "CHECKSUM_VALUE",
    "iso_url": "/path/to/iso"
  }
}

The run-powershell.yml playbook is:

# This playbook tests the script module on Windows hosts

- name: Run Ansible play
  hosts: all
  gather_facts: no
  tasks:
    - name: Ping windows machine
      win_command: cmd.exe /c powershell -Command "Write-Host 'Hello World!'"
#    - name: Ping windows machine
#      win_ping:
#    - name: Create a file
#      win_file:
#        path: "C:\\Windows\\Temp\\ansible_test.txt"
#        state: touch
#    - name: Run powershell script
#      script: a:\helloworld.ps1

The final snippet of the error as seen in packer.log is:

ui: [0;32m    virtualbox-iso: <127.0.0.1> (1, '{"exception":"At C:\\\\Users\\\\packer\\\\AppData\\\\Local\\\\Temp\\\\ansible-tmp-1493195766.64-166408222728325\\\\win_command.ps1:25 char:16\\r\\n+ $parsed_args = Parse-Args $args $false\\r\\n+                ~~~~~~~~~~","msg":"The term \\u0027Parse-Args\\u0027 is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.","failed":true}\r\n', 'OpenSSH_6.9p1, LibreSSL 2.1.8\r\ndebug1: Reading configuration data /Users/mk/.ssh/config\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug1: /etc/ssh/ssh_config line 21: Applying options for *\r\ndebug1: auto-mux: Trying existing master\r\ndebug2: fd 3 setting O_NONBLOCK\r\ndebug2: mux_client_hello_exchange: master version 4\r\ndebug3: mux_client_forwards: request forwardings: 0 local, 0 remote\r\ndebug3: mux_client_request_session: entering\r\ndebug3: mux_client_request_alive: entering\r\ndebug3: mux_client_request_alive: done pid = 7498\r\ndebug3: mux_client_request_session: session request sent\r\ndebug1: mux_client_request_session: master session id: 2\r\ndebug3: mux_client_read_packet: read header failed: Broken pipe\r\ndebug2: Received exit status from master 1\r\nShared connection to 127.0.0.1 closed.\r\n')[0m
ui: [0;32m    virtualbox-iso: The full traceback is:[0m
ui: [0;32m    virtualbox-iso: At C:\Users\packer\AppData\Local\Temp\ansible-tmp-1493195766.64-166408222728325\win_command.ps1:25 char:16[0m
ui: [0;32m    virtualbox-iso: + $parsed_args = Parse-Args $args $false[0m
ui: [0;32m    virtualbox-iso: +                ~~~~~~~~~~[0m
ui: [0;32m    virtualbox-iso: fatal: [default]: FAILED! => {[0m
ui: [0;32m    virtualbox-iso:     "changed": false,[0m
ui: [0;32m    virtualbox-iso:     "failed": true,[0m
ui: [0;32m    virtualbox-iso:     "msg": "The term 'Parse-Args' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again."[0m
ui: [0;32m    virtualbox-iso: }[0m
ui: [0;32m    virtualbox-iso:  to retry, use: --limit @/Users/mk/Workspace/packer/win81/provisioner/run-powershell.retry[0m
ui: [0;32m    virtualbox-iso:[0m
ui: [0;32m    virtualbox-iso: PLAY RECAP *********************************************************************[0m
ui: [0;32m    virtualbox-iso: default                    : ok=0    changed=0    unreachable=0    failed=1[0m
ui: [0;32m    virtualbox-iso:[0m
packer: 2017/04/26 18:36:31 shutting down the SSH proxy
packer: 2017/04/26 18:36:31 Executing VBoxManage: []string{"controlvm", "packer-virtualbox-iso-1493195197", "poweroff"}

None of the ansible windows tasks (executed as .ps1 on the Windows VM) are able to execute, and receive the same error as above (see commented lines in my playbook). They all error on the Parse-Args cmdlet, which is a standard Powershell function, but is not recognised on the Windows 8.1 vm for some reason.

FYI: I also tried running winrm on port 5985 (without SSL), and get the same error.

Any help to get past this issue will be highly appreciated.

Upvotes: 1

Views: 1193

Answers (1)

Ricardo Herrera
Ricardo Herrera

Reputation: 34

Was having this same exact issue. I found out something broke in recent versions of Ansible. I downgraded my Ansible installation to 2.2.0 and it's working as expected following Packer documentation.

Upvotes: 1

Related Questions