diff --git a/lib/ansible/modules/extras/system/alternatives.py b/lib/ansible/modules/extras/system/alternatives.py index ce51ee860a9..575cb572867 100755 --- a/lib/ansible/modules/extras/system/alternatives.py +++ b/lib/ansible/modules/extras/system/alternatives.py @@ -75,13 +75,14 @@ def main(): current_path = None all_alternatives = [] + os_family = None (rc, query_output, query_error) = module.run_command( [UPDATE_ALTERNATIVES, '--query', name] ) # Gather the current setting and all alternatives from the query output. - # Query output should look something like this: + # Query output should look something like this on Debian systems: # Name: java # Link: /usr/bin/java @@ -102,6 +103,7 @@ def main(): # java.1.gz /usr/lib/jvm/java-7-openjdk-amd64/jre/man/man1/java.1.gz if rc == 0: + os_family = "Debian" for line in query_output.splitlines(): split_line = line.split(':') if len(split_line) == 2: @@ -113,13 +115,27 @@ def main(): all_alternatives.append(value) elif key == 'Link' and not link: link = value + elif rc == 2: + os_family = "RedHat" + # This is the version of update-alternatives that is shipped with + # chkconfig on RedHat-based systems. Try again with the right options. + (rc, query_output, query_error) = module.run_command( + [UPDATE_ALTERNATIVES, '--list'] + ) + for line in query_output.splitlines(): + line_name, line_mode, line_path = line.strip().split("\t") + if line_name != name: + continue + current_path = line_path + break if current_path != path: if module.check_mode: module.exit_json(changed=True, current_path=current_path) try: # install the requested path if necessary - if path not in all_alternatives: + # (unsupported on the RedHat version) + if path not in all_alternatives and os_family == "Debian": module.run_command( [UPDATE_ALTERNATIVES, '--install', link, name, path, str(DEFAULT_LINK_PRIORITY)], check_rc=True