Change default smart connection to ssh on macOS and remove paramiko from requirements.txt (#54738)

* Remove default use of paramiko connection plugin on macOS
    This fix was originally to work around a bug that caused a kernel panic on macOS
    that has since been fixed.
* Remove paramiko from requirements.txt
* Move paramiko checking to common place
* Drop the warnings obfiscation code
* Update pip installation instructions to reflect upstream instructions
* Fix tests on CentOS 6 (Python 2.6) that now show Python deprecation warnings
* Add changelog fragment
This commit is contained in:
Sam Doran
2019-04-03 22:35:59 -04:00
committed by GitHub
parent 9776037abe
commit 6ce9cf7741
13 changed files with 92 additions and 104 deletions

View File

@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2019 Ansible Project
# Simplified BSD License (see licenses/simplified_bsd.txt or https://opensource.org/licenses/BSD-2-Clause)
from __future__ import absolute_import, division, print_function
__metaclass__ = type
PARAMIKO_IMPORT_ERR = None
paramiko = None
try:
import paramiko
except ImportError:
try:
import ansible_paramiko as paramiko
except (ImportError, AttributeError) as err: # paramiko and gssapi are incompatible and raise AttributeError not ImportError
PARAMIKO_IMPORT_ERR = err
except AttributeError as err: # paramiko and gssapi are incompatible and raise AttributeError not ImportError
PARAMIKO_IMPORT_ERR = err

View File

@@ -206,6 +206,7 @@ from copy import deepcopy
import collections
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.compat.paramiko import paramiko
from ansible.module_utils.network.common.utils import remove_default_spec
from ansible.module_utils.network.iosxr.iosxr import get_config, load_config, is_netconf, is_cliconf
from ansible.module_utils.network.iosxr.iosxr import iosxr_argument_spec, build_xml, etree_findall
@@ -216,15 +217,6 @@ try:
except ImportError:
HAS_B64 = False
HAS_PARAMIKO = True
try:
import paramiko
except ImportError:
try:
import ansible_paramiko as paramiko
except ImportError:
HAS_PARAMIKO = False
class PublicKeyManager(object):
def __init__(self, module, result):
@@ -693,7 +685,7 @@ def main():
msg='library base64 is required but does not appear to be '
'installed. It can be installed using `pip install base64`'
)
if not HAS_PARAMIKO:
if paramiko is None:
module.fail_json(
msg='library paramiko is required but does not appear to be '
'installed. It can be installed using `pip install paramiko`'

View File

@@ -160,20 +160,12 @@ import re
import time
import traceback
from ansible.module_utils.compat.paramiko import paramiko
from ansible.module_utils.network.nxos.nxos import run_commands
from ansible.module_utils.network.nxos.nxos import nxos_argument_spec, check_args
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils._text import to_native, to_text, to_bytes
HAS_PARAMIKO = True
try:
import paramiko
except ImportError:
try:
import ansible_paramiko as paramiko
except ImportError:
HAS_PARAMIKO = False
try:
from scp import SCPClient
HAS_SCP = True
@@ -394,7 +386,7 @@ def main():
'installed. It can be installed using `pip install pexpect`'
)
else:
if not HAS_PARAMIKO:
if paramiko is None:
module.fail_json(
msg='library paramiko is required when file_pull is False but does not appear to be '
'installed. It can be installed using `pip install paramiko`'

View File

@@ -81,20 +81,11 @@ ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['deprecated'],
'supported_by': 'community'}
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.compat.paramiko import paramiko
import time
import sys
HAS_LIB = True
try:
import paramiko
except ImportError:
try:
import ansible_paramiko as paramiko
except ImportError:
HAS_LIB = False
_PROMPTBUFF = 4096
@@ -189,7 +180,7 @@ def main():
newpassword=dict(no_log=True, required=True)
)
module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True)
if not HAS_LIB:
if paramiko is None:
module.fail_json(msg='paramiko is required for this module')
ip_address = module.params["ip_address"]

View File

@@ -87,20 +87,11 @@ ANSIBLE_METADATA = {'metadata_version': '1.1',
'supported_by': 'community'}
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils._text import to_native
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.compat.paramiko import paramiko
import time
HAS_LIB = True
try:
import paramiko
except ImportError:
try:
import ansible_paramiko as paramiko
except ImportError:
HAS_LIB = False
_PROMPTBUFF = 4096
@@ -174,7 +165,7 @@ def main():
)
module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=False,
required_one_of=[['key_filename', 'password']])
if not HAS_LIB:
if paramiko is None:
module.fail_json(msg='paramiko is required for this module')
ip_address = module.params["ip_address"]

View File

@@ -28,6 +28,7 @@ import sys
from ansible import constants as C
from ansible import context
from ansible.errors import AnsibleError
from ansible.module_utils.compat.paramiko import paramiko
from ansible.module_utils.six import iteritems
from ansible.playbook.attribute import FieldAttribute
from ansible.playbook.base import Base
@@ -408,18 +409,12 @@ class PlayContext(Base):
conn_type = None
if self._attributes['connection'] == 'smart':
conn_type = 'ssh'
if sys.platform.startswith('darwin') and self.password:
# due to a current bug in sshpass on OSX, which can trigger
# a kernel panic even for non-privileged users, we revert to
# paramiko on that OS when a SSH password is specified
# see if SSH can support ControlPersist if not use paramiko
if not check_for_controlpersist(self.ssh_executable) and paramiko is not None:
conn_type = "paramiko"
else:
# see if SSH can support ControlPersist if not use paramiko
if not check_for_controlpersist(self.ssh_executable):
conn_type = "paramiko"
# if someone did `connection: persistent`, default it to using a persistent paramiko connection to avoid problems
elif self._attributes['connection'] == 'persistent':
elif self._attributes['connection'] == 'persistent' and paramiko is not None:
conn_type = 'paramiko'
if conn_type:

View File

@@ -149,6 +149,7 @@ from ansible.errors import (
AnsibleError,
AnsibleFileNotFound,
)
from ansible.module_utils.compat.paramiko import PARAMIKO_IMPORT_ERR, paramiko
from ansible.module_utils.six import iteritems
from ansible.module_utils.six.moves import input
from ansible.plugins.connection import ConnectionBase
@@ -168,23 +169,6 @@ Are you sure you want to continue connecting (yes/no)?
# SSH Options Regex
SETTINGS_REGEX = re.compile(r'(\w+)(?:\s*=\s*|\s+)(.+)')
# prevent paramiko warning noise -- see http://stackoverflow.com/questions/3920502/
HAVE_PARAMIKO = False
PARAMIKO_IMP_ERR = None
with warnings.catch_warnings():
warnings.simplefilter("ignore")
try:
import paramiko
HAVE_PARAMIKO = True
except ImportError:
try:
import ansible_paramiko as paramiko
HAVE_PARAMIKO = True
except (ImportError, AttributeError) as err: # paramiko and gssapi are incompatible and raise AttributeError not ImportError
PARAMIKO_IMP_ERR = err
except AttributeError as err: # paramiko and gssapi are incompatible and raise AttributeError not ImportError
PARAMIKO_IMP_ERR = err
class MyAddPolicy(object):
"""
@@ -313,8 +297,8 @@ class Connection(ConnectionBase):
def _connect_uncached(self):
''' activates the connection object '''
if not HAVE_PARAMIKO:
raise AnsibleError("paramiko is not installed: %s" % to_native(PARAMIKO_IMP_ERR))
if paramiko is None:
raise AnsibleError("paramiko is not installed: %s" % to_native(PARAMIKO_IMPORT_ERR))
port = self._play_context.port or 22
display.vvv("ESTABLISH PARAMIKO SSH CONNECTION FOR USER: %s on PORT %s TO %s" % (self._play_context.remote_user, port, self._play_context.remote_addr),