'Packer + Ansible - "winrm or requests is not installed: No module named 'winrm'"

I'm trying to integrate Ansible with Packer to configure a Windows Client.

Running from Azure Pipelines:

  • Ubuntu-Latest
  • Python 3.8.10
  • ansible [core 2.12.4]
  • packer 1.8.0

In the Pipeline I have tried to install pywinrm

pip install --ignore-installed pywinrm

But still receive this error when packer using the Ansible Provisioner:

==> azure-arm.windowsvm: Waiting for WinRM to become available...
    azure-arm.windowsvm: WinRM connected.
==> azure-arm.windowsvm: Connected to WinRM!
==> azure-arm.windowsvm: Provisioning with Ansible...
    azure-arm.windowsvm: Not using Proxy adapter for Ansible run:
    azure-arm.windowsvm:    Using WinRM Password from Packer communicator...
==> azure-arm.windowsvm: Executing Ansible: ansible-playbook -e packer_build_name="windowsvm" -e packer_builder_type=azure-arm -vvv -e ansible_winrm_server_cert_validation=ignore ansible_python_interpreter=/usr/bin/python3 -e ansible_password=***** -i /tmp/packer-provisioner-ansible141521969 /home/vsts/work/1/s/packer/win10-client/ansible/apb_os.yml
    azure-arm.windowsvm: ansible-playbook [core 2.12.4]
    azure-arm.windowsvm:   config file = None
    azure-arm.windowsvm:   configured module search path = ['/home/vsts/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
    azure-arm.windowsvm:   ansible python module location = /opt/pipx/venvs/ansible-core/lib/python3.8/site-packages/ansible
    azure-arm.windowsvm:   ansible collection location = /home/vsts/.ansible/collections:/usr/share/ansible/collections
    azure-arm.windowsvm:   executable location = /opt/pipx_bin/ansible-playbook
    azure-arm.windowsvm:   python version = 3.8.10 (default, Mar 15 2022, 12:22:08) [GCC 9.4.0]
    azure-arm.windowsvm:   jinja version = 3.1.1
    azure-arm.windowsvm:   libyaml = True
    azure-arm.windowsvm: No config file found; using defaults
    azure-arm.windowsvm: host_list declined parsing /tmp/packer-provisioner-ansible141521969 as it did not pass its verify_file() method
    azure-arm.windowsvm: script declined parsing /tmp/packer-provisioner-ansible141521969 as it did not pass its verify_file() method
    azure-arm.windowsvm: auto declined parsing /tmp/packer-provisioner-ansible141521969 as it did not pass its verify_file() method
    azure-arm.windowsvm: Parsed /tmp/packer-provisioner-ansible141521969 inventory source with ini plugin
    azure-arm.windowsvm: redirecting (type: modules) ansible.builtin.win_acl to ansible.windows.win_acl
    azure-arm.windowsvm: redirecting (type: modules) ansible.builtin.win_acl to ansible.windows.win_acl
    azure-arm.windowsvm: redirecting (type: modules) ansible.builtin.win_acl to ansible.windows.win_acl
    azure-arm.windowsvm: redirecting (type: modules) ansible.builtin.win_acl to ansible.windows.win_acl
    azure-arm.windowsvm: redirecting (type: modules) ansible.builtin.win_acl to ansible.windows.win_acl
    azure-arm.windowsvm: redirecting (type: modules) ansible.builtin.win_acl to ansible.windows.win_acl
    azure-arm.windowsvm: Skipping callback 'default', as we already have a stdout callback.
    azure-arm.windowsvm: Skipping callback 'minimal', as we already have a stdout callback.
    azure-arm.windowsvm: Skipping callback 'oneline', as we already have a stdout callback.
    azure-arm.windowsvm:
    azure-arm.windowsvm: PLAYBOOK: apb_os.yml ***********************************************************
    azure-arm.windowsvm: 1 plays in /home/vsts/work/1/s/packer/win10-client/ansible/apb_os.yml
    azure-arm.windowsvm:
    azure-arm.windowsvm: PLAY [Provision Image with OS Config] ******************************************
    azure-arm.windowsvm:
    azure-arm.windowsvm: TASK [Gathering Facts] *********************************************************
    azure-arm.windowsvm: task path: /home/vsts/work/1/s/packer/win10-client/ansible/apb_os.yml:1
    azure-arm.windowsvm: redirecting (type: modules) ansible.builtin.setup to ansible.windows.setup
    azure-arm.windowsvm: Using module file /opt/pipx/venvs/ansible-core/lib/python3.8/site-packages/ansible_collections/ansible/windows/plugins/modules/setup.ps1
    azure-arm.windowsvm: Pipelining is enabled.
    azure-arm.windowsvm: fatal: [default]: FAILED! => {
    azure-arm.windowsvm:     "msg": "winrm or requests is not installed: No module named 'winrm'"
    azure-arm.windowsvm: }
    azure-arm.windowsvm:
    azure-arm.windowsvm: PLAY RECAP *********************************************************************
    azure-arm.windowsvm: default                    : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

Here is the Packer Ansible Provsioner:

  provisioner "ansible" {
      playbook_file    = "${var.WorkingDirectory}/packer/win10-client/ansible/apb_os.yml"
      user             = "Admin"
      use_proxy        = false
      extra_arguments  = ["-vvv", "-e", "ansible_winrm_server_cert_validation=ignore ansible_python_interpreter=/usr/bin/python3"]
  }

My pip list

Package                Version             
---------------------- --------------------
argcomplete            2.0.0               
attrs                  19.3.0              
Automat                0.8.0               
blinker                1.4                 
certifi                2021.10.8           
cffi                   1.15.0              
chardet                3.0.4               
charset-normalizer     2.0.12              
Click                  7.0                 
cloud-init             22.1                
colorama               0.4.3               
command-not-found      0.3                 
configobj              5.0.6               
constantly             15.1.0              
crcmod                 1.7                 
crit                   0.0.1               
cryptography           36.0.2              
dbus-python            1.2.16              
distro                 1.4.0               
distro-info            0.23ubuntu1  
entrypoints            0.3                 
httplib2               0.14.0              
hyperlink              19.0.0              
idna                   3.3                 
importlib-metadata     1.5.0               
incremental            16.10.1             
Jinja2                 2.10.1              
jsonpatch              1.22                
jsonpointer            2.0                 
jsonschema             3.2.0               
keyring                18.0.1        
language-selector      0.1                 
launchpadlib           1.10.13             
lazr.restfulclient     0.14.2              
lazr.uri               1.0.3               
MarkupSafe             1.1.0               
more-itertools         4.2.0               
netifaces              0.10.4              
ntlm-auth              1.5.0               
oauthlib               3.1.0               
packaging              21.3                
pexpect                4.6.0               
pip                    20.0.2              
pipx                   1.0.0               
protobuf               3.6.1               
pyasn1                 0.4.2               
pyasn1-modules         0.2.1               
pycparser              2.21                
Pygments               2.3.1
PyGObject              3.36.0              
PyHamcrest             1.9.0               
PyJWT                  1.7.1               
pymacaroons            0.13.0              
PyNaCl                 1.3.0               
pyOpenSSL              19.0.0              
pyparsing              3.0.7               
pyparted               3.11.2              
pyrsistent             0.15.5              
pyserial               3.4                 
python-apt             2.0.0+ubuntu0.20.4.7
python-debian          0.1.36ubuntu1       
pywinrm                0.4.2               
PyYAML                 5.3.1               
requests               2.27.1              
requests-ntlm          1.1.0               
requests-unixsocket    0.2.0               
SecretStorage          2.3.1               
service-identity       18.1.0              
setuptools             45.2.0              
simplejson             3.16.0              
six                    1.16.0              
sos                    4.3                 
ssh-import-id          5.10                
systemd-python         234                 
Twisted                18.9.0              
ubuntu-advantage-tools 27.6                
ufw                    0.36                
urllib3                1.26.9              
userpath               1.8.0               
wadllib                1.3.3               
WALinuxAgent           2.2.46              
wheel                  0.34.2              
xmltodict              0.12.0              
zipp                   1.0.0               
zope.interface         4.7.1 

Any pointers in the right direction would be greatly appreciated - Thanks!



Solution 1:[1]

The pipeline was running a virtual env which was where ansible was looking for the pywinrm module.

I had to activate this by using

. /opt/pipx/venvs/ansible-core/bin/activate

The ansible provisioner does tell you where it's looking for this module.

Once activated, this allowed me to install the pywinrm module which was missing and allowed it to work.

Alternatively you could create script to create and install everything within a venv using the command attribute for the ansible provisioner.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 ASHR