diff --git a/examples/ansible.cfg b/examples/ansible.cfg index 207e060add..32c9554556 100644 --- a/examples/ansible.cfg +++ b/examples/ansible.cfg @@ -60,6 +60,10 @@ sudo_user=root transport=paramiko +# the following makes ansible use scp if the connection type is ssh (default is sftp) + +scp_if_ssh=True + # remote SSH port to be used when --port or "port:" or an equivalent inventory # variable is not specified. diff --git a/lib/ansible/constants.py b/lib/ansible/constants.py index b97cfab85c..53656b4475 100644 --- a/lib/ansible/constants.py +++ b/lib/ansible/constants.py @@ -86,6 +86,7 @@ DEFAULT_SUDO_USER = get_config(p, DEFAULTS, 'sudo_user', 'ANSIBLE DEFAULT_ASK_SUDO_PASS = get_config(p, DEFAULTS, 'ask_sudo_pass', 'ANSIBLE_ASK_SUDO_PASS', False) DEFAULT_REMOTE_PORT = int(get_config(p, DEFAULTS, 'remote_port', 'ANSIBLE_REMOTE_PORT', 22)) DEFAULT_TRANSPORT = get_config(p, DEFAULTS, 'transport', 'ANSIBLE_TRANSPORT', 'paramiko') +DEFAULT_SCP_IF_SSH = get_config(p, DEFAULTS, 'scp_if_ssh', 'ANSIBLE_SCP_IF_SSH', False) DEFAULT_MANAGED_STR = get_config(p, DEFAULTS, 'ansible_managed', None, 'Ansible managed: {file} modified on %Y-%m-%d %H:%M:%S by {uid} on {host}') DEFAULT_ACTION_PLUGIN_PATH = shell_expand_path(get_config(p, DEFAULTS, 'action_plugins', None, '/usr/share/ansible_plugins/action_plugins')) diff --git a/lib/ansible/runner/connection_plugins/ssh.py b/lib/ansible/runner/connection_plugins/ssh.py index 97b8e26d2d..3a94ad40c4 100644 --- a/lib/ansible/runner/connection_plugins/ssh.py +++ b/lib/ansible/runner/connection_plugins/ssh.py @@ -118,20 +118,34 @@ class Connection(object): vvv("PUT %s TO %s" % (in_path, out_path), host=self.host) if not os.path.exists(in_path): raise errors.AnsibleFileNotFound("file or module does not exist: %s" % in_path) - sftp_cmd = ["sftp"] + self.common_args + [self.host] - p = subprocess.Popen(sftp_cmd, stdin=subprocess.PIPE, - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout, stderr = p.communicate("put %s %s\n" % (in_path, out_path)) + if C.DEFAULT_SCP_IF_SSH: + ft_cmd = ["scp"] + self.common_args + ft_cmd += [in_path,self.host + ":" + out_path] + p = subprocess.Popen(ft_cmd, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = p.communicate() + else: + sftp_cmd = ["sftp"] + self.common_args + [self.host] + p = subprocess.Popen(sftp_cmd, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = p.communicate("put %s %s\n" % (in_path, out_path)) if p.returncode != 0: raise errors.AnsibleError("failed to transfer file to %s:\n%s\n%s" % (out_path, stdout, stderr)) def fetch_file(self, in_path, out_path): ''' fetch a file from remote to local ''' vvv("FETCH %s TO %s" % (in_path, out_path), host=self.host) - sftp_cmd = ["sftp"] + self.common_args + [self.host] - p = subprocess.Popen(sftp_cmd, stdin=subprocess.PIPE, - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout, stderr = p.communicate("get %s %s\n" % (in_path, out_path)) + if C.DEFAULT_SCP_IF_SSH: + ft_cmd = ["scp"] + self.common_args + ft_cmd += [self.host + ":" + in_path, out_path] + p = subprocess.Popen(ft_cmd, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = p.communicate() + else: + sftp_cmd = ["sftp"] + self.common_args + [self.host] + p = subprocess.Popen(sftp_cmd, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = p.communicate("get %s %s\n" % (in_path, out_path)) if p.returncode != 0: raise errors.AnsibleError("failed to transfer file from %s:\n%s\n%s" % (in_path, stdout, stderr))