From db84e2c98985a6df09c70702184cf109b557750a Mon Sep 17 00:00:00 2001 From: Sam Doran Date: Mon, 26 Oct 2020 13:53:31 -0400 Subject: [PATCH] systemd - fix issue with capbpf and newer kernel (#72337) A bug existed in systemd 245 that did not properly handle unknown kernel capabilities gracefully. This resulted in incomplete output when querying for the service status. It is possible to get service status by other means. This PR works around this issue by getting service status using other commands in the event of a failure due to this bug. --- .../fragments/71528-systemd-capbpf-workaround.yml | 4 ++++ lib/ansible/modules/systemd.py | 11 +++++++++++ 2 files changed, 15 insertions(+) create mode 100644 changelogs/fragments/71528-systemd-capbpf-workaround.yml diff --git a/changelogs/fragments/71528-systemd-capbpf-workaround.yml b/changelogs/fragments/71528-systemd-capbpf-workaround.yml new file mode 100644 index 00000000000..bf7cff1aa3f --- /dev/null +++ b/changelogs/fragments/71528-systemd-capbpf-workaround.yml @@ -0,0 +1,4 @@ +bugfixes: + - > + systemd - work around bug with ``systemd`` 245 and 5.8 kernel that does not correctly + report service state (https://github.com/ansible/ansible/issues/71528) diff --git a/lib/ansible/modules/systemd.py b/lib/ansible/modules/systemd.py index 921b64477d1..8b95750f4b9 100644 --- a/lib/ansible/modules/systemd.py +++ b/lib/ansible/modules/systemd.py @@ -400,6 +400,17 @@ def main(): # Check for loading error if is_systemd and not is_masked and 'LoadError' in result['status']: module.fail_json(msg="Error loading unit file '%s': %s" % (unit, result['status']['LoadError'])) + + # Workaround for https://github.com/ansible/ansible/issues/71528 + elif err and rc == 1 and 'Failed to parse bus message' in err: + result['status'] = parse_systemctl_show(to_native(out).split('\n')) + + (rc, out, err) = module.run_command("{systemctl} list-units '{unit}*'".format(systemctl=systemctl, unit=unit)) + is_systemd = unit in out + + (rc, out, err) = module.run_command("{systemctl} is-active '{unit}'".format(systemctl=systemctl, unit=unit)) + result['status']['ActiveState'] = out.rstrip('\n') + else: # list taken from man systemctl(1) for systemd 244 valid_enabled_states = [