diff --git a/lib/ansible/modules/packaging/os/apt.py b/lib/ansible/modules/packaging/os/apt.py index e177d81d180..de4cf37ac7b 100644 --- a/lib/ansible/modules/packaging/os/apt.py +++ b/lib/ansible/modules/packaging/os/apt.py @@ -30,9 +30,9 @@ options: state: description: - Indicates the desired package state. C(latest) ensures that the latest version is installed. C(build-dep) ensures the package build dependencies - are installed. + are installed. C(fixed) attempt to correct a system with broken dependencies in place. default: present - choices: [ absent, build-dep, latest, present ] + choices: [ absent, build-dep, latest, present, fixed ] update_cache: description: - Run the equivalent of C(apt-get update) before the operation. Can be run as part of the package installation or as a separate step. @@ -514,7 +514,7 @@ def mark_installed_manually(m, packages): def install(m, pkgspec, cache, upgrade=False, default_release=None, install_recommends=None, force=False, dpkg_options=expand_dpkg_options(DPKG_OPTIONS), - build_dep=False, autoremove=False, only_upgrade=False, + build_dep=False, fixed=False, autoremove=False, only_upgrade=False, allow_unauthenticated=False): pkg_list = [] packages = "" @@ -562,10 +562,15 @@ def install(m, pkgspec, cache, upgrade=False, default_release=None, else: only_upgrade = '' + if fixed: + fixed = '--fix-broken' + else: + fixed = '' + if build_dep: - cmd = "%s -y %s %s %s %s build-dep %s" % (APT_GET_CMD, dpkg_options, only_upgrade, force_yes, check_arg, packages) + cmd = "%s -y %s %s %s %s %s build-dep %s" % (APT_GET_CMD, dpkg_options, only_upgrade, fixed, force_yes, check_arg, packages) else: - cmd = "%s -y %s %s %s %s %s install %s" % (APT_GET_CMD, dpkg_options, only_upgrade, force_yes, autoremove, check_arg, packages) + cmd = "%s -y %s %s %s %s %s %s install %s" % (APT_GET_CMD, dpkg_options, only_upgrade, fixed, force_yes, autoremove, check_arg, packages) if default_release: cmd += " -t '%s'" % (default_release,) @@ -898,7 +903,7 @@ def get_cache(module): def main(): module = AnsibleModule( argument_spec=dict( - state=dict(type='str', default='present', choices=['absent', 'build-dep', 'installed', 'latest', 'present', 'removed', 'present']), + state=dict(type='str', default='present', choices=['absent', 'build-dep', 'installed', 'latest', 'present', 'removed', 'present', 'fixed']), update_cache=dict(type='bool', aliases=['update-cache']), cache_valid_time=dict(type='int', default=0), purge=dict(type='bool', default=False), @@ -1052,13 +1057,16 @@ def main(): if autoremove: cleanup(module, p['purge'], force=force_yes, operation='autoremove', dpkg_options=dpkg_options) - if p['state'] in ('latest', 'present', 'build-dep'): + if p['state'] in ('latest', 'present', 'build-dep', 'fixed'): state_upgrade = False state_builddep = False + state_fixed = False if p['state'] == 'latest': state_upgrade = True if p['state'] == 'build-dep': state_builddep = True + if p['state'] == 'fixed': + state_fixed = True success, retvals = install( module, @@ -1070,6 +1078,7 @@ def main(): force=force_yes, dpkg_options=dpkg_options, build_dep=state_builddep, + fixed=state_fixed, autoremove=autoremove, only_upgrade=p['only_upgrade'], allow_unauthenticated=allow_unauthenticated