#database #postgresql #robotframework #ssh-tunnel #robotframework-sshlibrary
Вопрос:
я столкнулся со следующей проблемой. У меня есть база данных PostgreSQL на удаленном сервере. Чтобы получить к нему доступ, мне нужно пройти через SSH-туннель.
Итак, этапы моего теста следующие:
- создайте туннель
- Подключитесь к базе данных
- выполнение запроса / запросов
Я могу создать туннель с помощью 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. Спасибо, это было действительно полезно, теперь это работает! Действительно признательна! Хороших выходных!