diff --git a/changelogs/fragments/9270-zypper-add-simple_errors.yaml b/changelogs/fragments/9270-zypper-add-simple_errors.yaml new file mode 100644 index 0000000000..9fcdf3403c --- /dev/null +++ b/changelogs/fragments/9270-zypper-add-simple_errors.yaml @@ -0,0 +1,3 @@ +minor_changes: + - zypper - add ``simple_errors`` option (https://github.com/ansible-collections/community.general/pull/9270). + - zypper - add ``quiet`` option (https://github.com/ansible-collections/community.general/pull/9270). \ No newline at end of file diff --git a/plugins/modules/zypper.py b/plugins/modules/zypper.py index ac5b6657ba..5bc6c766a0 100644 --- a/plugins/modules/zypper.py +++ b/plugins/modules/zypper.py @@ -142,6 +142,20 @@ options: description: - Adds C(--clean-deps) option to I(zypper) remove command. version_added: '4.6.0' + simple_errors: + type: bool + required: false + default: false + description: + - When set to V(true), provide a simplified error output (parses only the C() tag text in the XML output). + version_added: '10.2.0' + quiet: + type: bool + required: false + default: true + description: + - Adds C(--quiet) option to I(zypper) install/update command. + version_added: '10.2.0' notes: - When used with a C(loop:) each package will be processed individually, it is much more efficient to pass the list directly to the O(name) option. @@ -190,6 +204,13 @@ EXAMPLES = r""" name: '*' state: latest +- name: Install latest packages but dump error messages in a simplified format + community.general.zypper: + name: '*' + state: latest + simple_errors: true + quiet: false + - name: Apply all available patches community.general.zypper: name: '*' @@ -347,15 +368,38 @@ def parse_zypper_xml(m, cmd, fail_not_found=True, packages=None): # run zypper again with the same command to complete update return parse_zypper_xml(m, cmd, fail_not_found=fail_not_found, packages=packages) + # apply simple_errors logic to rc 0,102,103,106 + if m.params['simple_errors']: + stdout = get_simple_errors(dom) or stdout + return packages, rc, stdout, stderr + + # apply simple_errors logic to rc other than 0,102,103,106 + if m.params['simple_errors']: + stdout = get_simple_errors(dom) or stdout + m.fail_json(msg='Zypper run command failed with return code %s.' % rc, rc=rc, stdout=stdout, stderr=stderr, cmd=cmd) +def get_simple_errors(dom): + simple_errors = [] + message_xml_tags = dom.getElementsByTagName('message') + + if message_xml_tags is None: + return None + + for x in message_xml_tags: + simple_errors.append(x.firstChild.data) + return " \n".join(simple_errors) + + def get_cmd(m, subcommand): "puts together the basic zypper command arguments with those passed to the module" is_install = subcommand in ['install', 'update', 'patch', 'dist-upgrade'] is_refresh = subcommand == 'refresh' - cmd = [m.get_bin_path('zypper', required=True), '--quiet', '--non-interactive', '--xmlout'] + cmd = [m.get_bin_path('zypper', required=True), '--non-interactive', '--xmlout'] + if m.params['quiet']: + cmd.append('--quiet') if transactional_updates(): cmd = [m.get_bin_path('transactional-update', required=True), '--continue', '--drop-if-no-change', '--quiet', 'run'] + cmd if m.params['extra_args_precommand']: @@ -555,6 +599,8 @@ def main(): allow_vendor_change=dict(required=False, default=False, type='bool'), replacefiles=dict(required=False, default=False, type='bool'), clean_deps=dict(required=False, default=False, type='bool'), + simple_errors=dict(required=False, default=False, type='bool'), + quiet=dict(required=False, default=True, type='bool'), ), supports_check_mode=True )