Skip to content

Commit

Permalink
ANSIBLE_SSH_USETTY configuration option (ansible#33148)
Browse files Browse the repository at this point in the history
* Allow the user to circumvent adding -tt on ssh commands to help aid in
debugging ssh related problems.
* Move config to the plugin
* Set version_added
* Change yaml section to "connection"
* Fix ssh unit tests
  • Loading branch information
jctanner authored Nov 22, 2017
1 parent aa42a26 commit 218987e
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 1 deletion.
4 changes: 4 additions & 0 deletions examples/ansible.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,10 @@
# only be disabled if your sftp version has problems with batch mode
#sftp_batch_mode = False

# The -tt argument is passed to ssh when pipelining is not enabled because sudo
# requires a tty by default.
#use_tty = True

[persistent_connection]

# Configures the persistent connection timeout value in seconds. This value is
Expand Down
15 changes: 14 additions & 1 deletion lib/ansible/plugins/connection/ssh.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,15 @@
env: [{name: ANSIBLE_SCP_IF_SSH}]
ini:
- {key: scp_if_ssh, section: ssh_connection}
use_tty:
version_added: '2.5'
default: True
description: add -tt to ssh commands to force tty allocation
env: [{name: ANSIBLE_SSH_USETTY}]
ini:
- {key: usetty, section: ssh_connection}
type: boolean
yaml: {key: connection.usetty}
'''

import errno
Expand Down Expand Up @@ -957,7 +966,11 @@ def exec_command(self, cmd, in_data=None, sudoable=True):

ssh_executable = self._play_context.ssh_executable

if not in_data and sudoable:
# -tt can cause various issues in some environments so allow the user
# to disable it as a troubleshooting method.
use_tty = self.get_option('use_tty')

if not in_data and sudoable and use_tty:
args = (ssh_executable, '-tt', self.host, cmd)
else:
args = (ssh_executable, self.host, cmd)
Expand Down
8 changes: 8 additions & 0 deletions test/units/plugins/connection/test_ssh.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ def test_plugins_connection_ssh_exec_command(self):
conn._build_command.return_value = 'ssh something something'
conn._run = MagicMock()
conn._run.return_value = (0, 'stdout', 'stderr')
conn.get_option = MagicMock()
conn.get_option.return_value = True

res, stdout, stderr = conn.exec_command('ssh')
res, stdout, stderr = conn.exec_command('ssh', 'this is some data')
Expand Down Expand Up @@ -538,6 +540,8 @@ def test_retry_then_success(self, monkeypatch):

self.conn._build_command = MagicMock()
self.conn._build_command.return_value = 'ssh'
self.conn.get_option = MagicMock()
self.conn.get_option.return_value = True

return_code, b_stdout, b_stderr = self.conn.exec_command('ssh', 'some data')
assert return_code == 0
Expand All @@ -563,6 +567,8 @@ def test_multiple_failures(self, monkeypatch):

self.conn._build_command = MagicMock()
self.conn._build_command.return_value = 'ssh'
self.conn.get_option = MagicMock()
self.conn.get_option.return_value = True

pytest.raises(AnsibleConnectionFailure, self.conn.exec_command, 'ssh', 'some data')
assert self.mock_popen.call_count == 10
Expand All @@ -575,6 +581,8 @@ def test_abitrary_exceptions(self, monkeypatch):

self.conn._build_command = MagicMock()
self.conn._build_command.return_value = 'ssh'
self.conn.get_option = MagicMock()
self.conn.get_option.return_value = True

self.mock_popen.side_effect = [Exception('bad')] * 10
pytest.raises(Exception, self.conn.exec_command, 'ssh', 'some data')
Expand Down

0 comments on commit 218987e

Please sign in to comment.