Forum Discussion

Eljay's avatar
Eljay
Icon for Cirrus rankCirrus
Mar 07, 2023

Python code using Parallel-SSH library to connect to F5 BigIP

Hi,
I'm trying to use Parallel-SSH (Python library) to connect to F5 BigIP.

s = SSHClient(<host>,user=<username>, password=<password>, timeout=5, num_retries=1)
res = s.run_command("uname")
for line in res.stdout:
    print(line)

This simple code works perfectly toward a Red Hat server, but it fails toward F5 BigIP:

Here is the error message:
pssh.exceptions.AuthenticationError: ('Authentication error while connecting to %s:%s - %s - retries %s/%s', '<IP address>, 22, AuthenticationError(), 1, 1)

Has anyone gotten this to work with the Parallel-SSH library?
I have already tested Paramiko and that works, but I want to use Parallel-SSH.

7 Replies

  • For anyone else trying to get this to work on Mac...first:

    1. brew install cmake
    2. (In a venv) pip install ssh2-python
    3. (In a venv) pip install parallel-ssh

    Will post back on details if I can get it talking to BIG-IP. Just took a minute to get through the pip errors for this module.

    UPDATE: Got it working. Works with password or key file if you copied your ssh keys to BIG-IP.

    from pssh.clients import ParallelSSHClient
    
    hosts = ['ltm1.test.local', 'ltm2.test.local']
    #client = ParallelSSHClient(hosts, user='root', password='default')
    client = ParallelSSHClient(hosts, user='root', pkey='/Users/justme/.ssh/id_rsa')
    cmd = 'tmsh list ltm pool'
    
    output = client.run_command(cmd)
    for host_out in output:
        for line in host_out.stdout:
            print(line)
    
    ### One output for brevity ###
    /Users/justme/PycharmProjects/playground/venv/bin/python /Users/justme/PycharmProjects/playground/sshtest.py 
    ltm pool nginx-pool {
        members {
            172.16.102.5:http {
                address 172.16.102.5
                session monitor-enabled
                state up
            }
        }
        monitor http
    }
    
    Process finished with exit code 0

     

    • Eljay's avatar
      Eljay
      Icon for Cirrus rankCirrus

      Thanks, JRahm. Now I see that I wasn't crystal clear, I was using the single host client in Parallel-SSH. See examples for both single and multi host here: https://pypi.org/project/parallel-ssh/ 

      I can adapt my code to this solution as well. But I still wonder if it's a problem with the single host client in the Parallel-SSH library.

      Here's an example that works in Paramiko:

      from  paramiko.client import SSHClient
      
      p = SSHClient()
      p.load_system_host_keys()
      p.connect('<IP>', username=<username>, password=<password>)
      stdin, stdout, stderr = p.exec_command('uname')
      print(stdout.read().decode())

      And here's the code using single host client in Parallel-SSH that fails:

      import pssh.exceptions
      from pssh.clients import SSHClient
      
      s = SSHClient('<IP>',user=<username>, password=<password>, timeout=5, num_retries=1)
      res = s.run_command("uname")
      print(res)
      for line in res.stdout:
          print(line)

       

      • JRahm's avatar
        JRahm
        Icon for Admin rankAdmin

        Hi Eljay ... This also works just fine for me (both with key or password):

        from pssh.clients import SSHClient
        
        host = 'ltm15.test.local'
        s = SSHClient(host, user='root', password='default')
        # s = SSHClient(host, user='root', pkey='/Users/justme/.ssh/id_rsa')
        cmd = 'tmsh list ltm pool'
        
        res = s.run_command(cmd)
        print(res)
        for line in res.stdout:
            print(line)

        Output:

        /Users/justme/PycharmProjects/playground/venv/bin/python /Users/justme/PycharmProjects/playground/sshtest.py 
        	host=ltm15.test.local
        	alias=None
        	exit_code=None
        	channel=<ssh2.channel.Channel object at 0x107c46ef0>
        	exception=None
        	encoding=utf-8
        	read_timeout=None
        ltm pool nginx-pool {
            members {
                172.16.102.5:http {
                    address 172.16.102.5
                    session monitor-enabled
                    state up
                }
            }
            monitor http
        }
        
        Process finished with exit code 0

        My versions:

        • python: 3.11.2
        • ssh-python: 1.0.0
        • ssh2-python: 1.0.0
        • parallel-ssh: 2.12.0
        • BIG-IP: 15.1.8.1