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/changelogs/fragments/71528-systemd-improve-unit-searching.yml b/changelogs/fragments/71528-systemd-improve-unit-searching.yml new file mode 100644 index 00000000000..92e5228ff8e --- /dev/null +++ b/changelogs/fragments/71528-systemd-improve-unit-searching.yml @@ -0,0 +1,4 @@ +bugfixes: + - > + systemd - account for templated unit files using ``@`` when searching for + the unit file (https://github.com/ansible/ansible/pull/72347#issuecomment-730626228) diff --git a/changelogs/fragments/71528-systemd-list-unit-files.yml b/changelogs/fragments/71528-systemd-list-unit-files.yml new file mode 100644 index 00000000000..7b63f674a60 --- /dev/null +++ b/changelogs/fragments/71528-systemd-list-unit-files.yml @@ -0,0 +1,5 @@ +bugfixes: + - > + systemd - follow up fix to https://github.com/ansible/ansible/issues/72338 + to use ``list-unit-files`` rather than ``list-units`` in order to show + all units files on the system. diff --git a/lib/ansible/modules/systemd.py b/lib/ansible/modules/systemd.py index edebfc9de58..a0bf8057c6e 100644 --- a/lib/ansible/modules/systemd.py +++ b/lib/ansible/modules/systemd.py @@ -414,6 +414,19 @@ 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')) + + unit, sep, suffix = unit.partition('@') + unit_search = '{unit}{sep}*'.format(unit=unit, sep=sep) + (rc, out, err) = module.run_command("{systemctl} list-unit-files '{unit_search}'".format(systemctl=systemctl, unit_search=unit_search)) + 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 = [