Reputation: 215
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
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