Платформа робота: Подключение к базе данных PostgreSQL через SSH-туннель

#database #postgresql #robotframework #ssh-tunnel #robotframework-sshlibrary

Вопрос:

я столкнулся со следующей проблемой. У меня есть база данных PostgreSQL на удаленном сервере. Чтобы получить к нему доступ, мне нужно пройти через SSH-туннель.

Итак, этапы моего теста следующие:

  1. создайте туннель
  2. Подключитесь к базе данных
  3. выполнение запроса / запросов

Я могу создать туннель с помощью SSHLibrary, и это работает:

 SSHLibrary.Open Connection    10.xxx.xxx.xx  
SSHLibrary.Login     MySSH_User    MySSH_Password    delay=1      
SSHLibrary.Create Local SSH Tunnel    9191    ${IP_DATABASE}    22
 

Поэтому я продолжаю использовать библиотеку базы данных для выполнения подключения (и я проверил, что все поля правильные).:

 DatabaseLibrary.Connect To Database    psycopg2    ${DB_NAME}    ${USER_DB}    ${PASSWORD_DB}    ${IP_DATABASE}    ${PORT_DB}
 

но я получаю следующую ошибку:

 OperationalError: could not connect to server: Connection timed out (0x0000274C/10060)
        Is the server running on host "10.xxx.xxx.xx" and accepting
        TCP/IP connections on port 5432?
 

Как я могу это решить? Я думаю, что мне нужно каким-то образом указать, что подключение к базе данных должно осуществляться с помощью туннеля, но я не знаю, как это сделать.
Вот полный тестовый код:

 *** Settings ***
Library    DatabaseLibrary
Library    SSHLibrary

*** Variables ***
${IP_DATABASE}    10.xxx.xxx.xx
${PORT_DB}    5432
${DB_NAME}    MyNameDB
${SCHEMA_DATABASE}    MySchemaDB
${USER_DB}    MyUserDB
${PASSWORD_DB}    MyPasswordDB

*** Keywords ***
    
*** Test Cases ***
Connect To DB Via SSH
    SSHLibrary.Open Connection    10.xxx.xxx.xx  
    SSHLibrary.Login     MySSH_User    MySSH_Password    delay=1      
    SSHLibrary.Create Local SSH Tunnel    9191    ${IP_DATABASE}    22
    Sleep    2s
    DatabaseLibrary.Connect To Database    psycopg2    ${DB_NAME}    ${USER_DB}    ${PASSWORD_DB}    ${IP_DATABASE}    ${PORT_DB}
 

Я хотел бы сделать это с помощью RF, кто-нибудь может помочь?
Большое спасибо

Ответ №1:

Туннели Ssh должны работать таким образом, чтобы вы устанавливали SSH-соединение с другим хостом и предоставляли ПОРТ на локальном хосте, который затем будет перенаправлять трафик с этого порта на локальном хосте на IP/ПОРТ в конечной точке туннеля ..

Итак, допустим, у вас есть хост по адресу 192.168.100.10, на котором запущена ваша работа с роботом, и ему необходимо подключиться к базе данных в 192.168.50.100:

Если postgres доступен напрямую через ssh:

 Connect To DB Via SSH
    ${IP_DATABASE}=  192.168.50.100
    ${DB_PORT}=  5432
    SSHLibrary.Open Connection    ${IP_DATABASE}  
    SSHLibrary.Login     MySSH_User    MySSH_Password    delay=1      
    SSHLibrary.Create Local SSH Tunnel    ${DB_PORT}    ${IP_DATABASE}    ${DB_PORT}
    DatabaseLibrary.Connect To Database    psycopg2    ${DB_NAME}    ${USER_DB}    ${PASSWORD_DB}    127.0.0.1    ${PORT_DB}
 

Теперь, если вам нужно использовать ssh jump host, например, подключиться к ssh-серверу, который затем подключится к другому серверу, на котором работает postgres, все, что вам нужно сделать, это изменить ip-адрес туннеля, на который будет перенаправляться трафик:

 Connect To DB Via SSH
    ${IP_DATABASE}=  192.168.50.100
    ${IP_SSH_JUMPHOST}=   192.168.50.1
    ${DB_PORT}=  5432
    SSHLibrary.Open Connection    ${IP_JUMPHOST}  
    SSHLibrary.Login     MySSH_User    MySSH_Password    delay=1      
    SSHLibrary.Create Local SSH Tunnel    ${DB_PORT}    ${IP_DATABASE}    ${DB_PORT}
    DatabaseLibrary.Connect To Database    psycopg2    ${DB_NAME}    ${USER_DB}    ${PASSWORD_DB}    127.0.0.1    ${PORT_DB}
 

Комментарии:

1. Спасибо, это было действительно полезно, теперь это работает! Действительно признательна! Хороших выходных!