I am fairly new to Ansible and have now started automating some repetitive Windows administration tasks.
As a controller I use a Debian 11 VM where I have only Ansible and pywinrm installed. My test target is a Windows Server 2016 and everything works fine, I can install programs, create users or copy files. The only thing that does not work is the module “win_updates”.
I get the following message back when I call win_updates.
fatal: [ws2016-test01.minimaximal.de]: FAILED! => {"changed": false, "failed_update_count": 0, "filtered_updates": {}, "found_update_count": 0, "installed_up date_count": 0, "msg": "winrm put_file failed; nstdout: Active code page: 1252rn{"sha1":"753fdd143ad8962c56d33e56b128f3d4d19cfd3b"}rnnstderr ", "up dates": {}}
with -vvv
Traceback (most recent call last): File "/home/testuser/.local/lib/python3.9/site-packages/ansible/plugins/connection/winrm.py", line 661, in put_file put_output = json.loads(result.std_out) File "/usr/lib/python3.9/json/__init__.py", line 346, in loads return _default_decoder.decode(s) File "/usr/lib/python3.9/json/decoder.py", line 337, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/lib/python3.9/json/decoder.py", line 355, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/testuser/.ansible/collections/ansible_collections/ansible/windows/plugins/action/win_updates.py", line 761, in run result = self._run_sync(task_vars, module_options, reboot, reboot_timeout) File "/home/testuser/.ansible/collections/ansible_collections/ansible/windows/plugins/action/win_updates.py", line 821, in _run_sync poll_script_path = self._copy_script(_POLL_SCRIPT, 'poll.ps1') File "/home/testuser/.ansible/collections/ansible_collections/ansible/windows/plugins/action/win_updates.py", line 1036, in _copy_script self._transfer_file(to_text(b_local_script, errors='surrogate_or_strict'), remote_path) File "/home/testuser/.local/lib/python3.9/site-packages/ansible/plugins/action/__init__.py", line 477, in _transfer_file self._connection.put_file(local_path, remote_path) File "/home/testuser/.local/lib/python3.9/site-packages/ansible/plugins/connection/winrm.py", line 667, in put_file raise AnsibleError('winrm put_file failed; nstdout: %snstderr %s' % (to_native(result.std_out), to_native(stderr))) ansible.errors.AnsibleError: winrm put_file failed; stdout: Active code page: 1252 {"sha1":"753fdd143ad8962c56d33e56b128f3d4d19cfd3b"} stderr fatal: [ws2016-test01.minimaximal.de]: FAILED! => { "changed": false, "failed_update_count": 0, "filtered_updates": {}, "found_update_count": 0, "installed_update_count": 0, "msg": "winrm put_file failed; nstdout: Active code page: 1252rn{"sha1":"753fdd143ad8962c56d33e56b128f3d4d19cfd3b"}rnnstderr ", "updates": {} }
I have tested the exact same playbook from a CentOS 8 machine against the same target Windows server, and there are no problems at all. I tested with different Ansible and Python versions, same versions on the Debian controller as on the working CentOS machine, no difference.
I’m pretty sure it’s not a Windows problem and not an Ansible problem. I personally think it has something to do with missing or corrupted Python dependencies.
ansible –version
config file = None configured module search path = ['/home/testuser/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /home/testuser/.local/lib/python3.9/site-packages/ansible ansible collection location = /home/testuser/.ansible/collections:/usr/share/ansible/collections executable location = /usr/bin/ansible python version = 3.9.2 (default, Feb 28 2021, 17:03:44) [GCC 10.2.1 20210110] jinja version = 3.0.3 libyaml = True
pip3 list
Package Version ----------------- -------------- ansible 5.2.0 ansible-base 2.10.8 ansible-core 2.12.1 apache-libcloud 3.2.0 argcomplete 1.8.1 certifi 2020.6.20 cffi 1.15.0 chardet 4.0.0 cryptography 36.0.1 dnspython 2.0.0 httplib2 0.18.1 idna 2.10 Jinja2 3.0.3 jmespath 0.10.0 lockfile 0.12.2 MarkupSafe 2.0.1 netaddr 0.7.19 ntlm-auth 1.5.0 packaging 21.3 pip 20.3.4 pycparser 2.21 pycryptodomex 3.9.7 pycurl 7.43.0.6 pykerberos 1.1.14 pyparsing 3.0.6 PySimpleSOAP 1.16.2 python-apt 2.2.1 python-debian 0.1.39 python-debianbts 3.1.0 pywinrm 0.4.2 PyYAML 6.0 reportbug 7.10.3+deb11u1 requests 2.25.1 requests-kerberos 0.12.0 requests-ntlm 1.1.0 requests-toolbelt 0.9.1 resolvelib 0.5.4 selinux 3.1 setuptools 52.0.0 simplejson 3.17.2 six 1.16.0 urllib3 1.26.5 wheel 0.34.2 xmltodict 0.12.0
my failing test playbook
- name: "win_updates" hosts: all tasks: - name: install important updates ansible.windows.win_updates: category_names: - SecurityUpdates - CriticalUpdates
After 1.5 days of trying unsuccessfully, I’m really confused and have no idea anymore except to switch to CentOS, but our other systems are Debian.
Any ideas what could be the problem?
Advertisement
Answer
Adding the suitable env vars solved my problem.
env LANG=C LC_ALL=C ansible-playbook ...
I also created a new Debian VM and installed Ansible on it, it works out of the box. Probably I have destroyed something when I first installed Ansible.