mirror of
https://github.com/ansible-collections/community.general.git
synced 2026-05-06 13:22:48 +00:00
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:
19
lib/ansible/module_utils/compat/paramiko.py
Normal file
19
lib/ansible/module_utils/compat/paramiko.py
Normal 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
|
||||
@@ -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`'
|
||||
|
||||
@@ -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`'
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user