diff --git a/lib/ansible/constants.py b/lib/ansible/constants.py index 7c6195d896..f38b503949 100644 --- a/lib/ansible/constants.py +++ b/lib/ansible/constants.py @@ -78,7 +78,6 @@ DEFAULT_TRANSPORT = get_config(p, DEFAULTS, 'transport', 'ANSIBLE # non-configurable things DEFAULT_REMOTE_PASS = None -DEFAULT_TRANSPORT_OPTS = ['local', 'paramiko', 'ssh'] DEFAULT_SUDO_PASS = None DEFAULT_SUBSET = None diff --git a/lib/ansible/runner/connection/__init__.py b/lib/ansible/runner/connection.py similarity index 67% rename from lib/ansible/runner/connection/__init__.py rename to lib/ansible/runner/connection.py index eda7b61df0..379fbd2183 100644 --- a/lib/ansible/runner/connection/__init__.py +++ b/lib/ansible/runner/connection.py @@ -18,9 +18,16 @@ ################################################ -import local -import paramiko_ssh -import ssh +from ansible import utils +from ansible.errors import AnsibleError + +import os.path +dirname = os.path.dirname(__file__) +modules = utils.import_plugins(os.path.join(dirname, 'connections')) + +# rename this module +modules['paramiko'] = modules['paramiko_ssh'] +del modules['paramiko_ssh'] class Connection(object): ''' Handles abstract connections to remote hosts ''' @@ -31,13 +38,9 @@ class Connection(object): def connect(self, host, port=None): conn = None transport = self.runner.transport - if transport == 'local': - conn = local.LocalConnection(self.runner, host) - elif transport == 'paramiko': - conn = paramiko_ssh.ParamikoConnection(self.runner, host, port) - elif transport == 'ssh': - conn = ssh.SSHConnection(self.runner, host, port) - if conn is None: - raise Exception("unsupported connection type") + module = modules.get(transport, None) + if module is None: + raise AnsibleError("unsupported connection type: %s" % transport) + conn = module.Connection(self.runner, host, port) return conn.connect() diff --git a/lib/ansible/runner/connection/local.py b/lib/ansible/runner/connections/local.py similarity index 95% rename from lib/ansible/runner/connection/local.py rename to lib/ansible/runner/connections/local.py index c0ddb50842..f1ae2e0804 100644 --- a/lib/ansible/runner/connection/local.py +++ b/lib/ansible/runner/connections/local.py @@ -22,12 +22,14 @@ import subprocess from ansible import errors from ansible.callbacks import vvv -class LocalConnection(object): +class Connection(object): ''' Local based connections ''' - def __init__(self, runner, host): + def __init__(self, runner, host, port): self.runner = runner self.host = host + # port is unused, since this is local + self.port = port def connect(self, port=None): ''' connect to the local host; nothing to do here ''' diff --git a/lib/ansible/runner/connection/paramiko_ssh.py b/lib/ansible/runner/connections/paramiko_ssh.py similarity index 99% rename from lib/ansible/runner/connection/paramiko_ssh.py rename to lib/ansible/runner/connections/paramiko_ssh.py index 7ab23b25a1..d4083f5d22 100644 --- a/lib/ansible/runner/connection/paramiko_ssh.py +++ b/lib/ansible/runner/connections/paramiko_ssh.py @@ -33,10 +33,11 @@ with warnings.catch_warnings(): except ImportError: pass -class ParamikoConnection(object): +class Connection(object): ''' SSH based connections with Paramiko ''' def __init__(self, runner, host, port=None): + self.ssh = None self.runner = runner self.host = host diff --git a/lib/ansible/runner/connection/ssh.py b/lib/ansible/runner/connections/ssh.py similarity index 99% rename from lib/ansible/runner/connection/ssh.py rename to lib/ansible/runner/connections/ssh.py index 85dce9d8ea..788989c3a6 100644 --- a/lib/ansible/runner/connection/ssh.py +++ b/lib/ansible/runner/connections/ssh.py @@ -27,7 +27,7 @@ import ansible.constants as C from ansible.callbacks import vvv from ansible import errors -class SSHConnection(object): +class Connection(object): ''' ssh based connections ''' def __init__(self, runner, host, port): diff --git a/lib/ansible/utils.py b/lib/ansible/utils.py index 5680f613e0..e44691c7a4 100644 --- a/lib/ansible/utils.py +++ b/lib/ansible/utils.py @@ -29,6 +29,8 @@ from ansible import __version__ import ansible.constants as C import time import StringIO +import imp +import glob VERBOSITY=0 @@ -393,7 +395,6 @@ def base_parser(constants=C, usage="", output_opts=False, runas_opts=False, if connect_opts: parser.add_option('-c', '--connection', dest='connection', - choices=C.DEFAULT_TRANSPORT_OPTS, default=C.DEFAULT_TRANSPORT, help="connection type to use (default=%s)" % C.DEFAULT_TRANSPORT) @@ -451,3 +452,14 @@ def filter_leading_non_json_lines(buf): filtered_lines.write(line + '\n') return filtered_lines.getvalue() + import glob, imp + from os.path import join, basename, splitext + +def import_plugins(directory): + modules = {} + for path in glob.glob(os.path.join(directory, '*.py')): + name, ext = os.path.splitext(os.path.basename(path)) + modules[name] = imp.load_source(name, path) + return modules + +