Пробегаюсь по этой проблеме уже 2-3 дня, но безуспешно. Надеюсь, кто-то направит меня и поможет решить эту проблему здесь.
Я запускаю приложение Python из каталога /home/admin/app/example.py в трехузловой кластерной среде Ubuntu 18.04, которая должна подключаться к NetSuite через ODBC и читать список таблиц. Настройка кода и каталога одинакова для всех 3 узлов. На все эти 3 узла существует запрос маршрутизации балансировщика нагрузки.
Вот пример того, как соединение осуществляется через модуль PyODBC:
import pyodbc
cnxn = pyodbc.connect('DSN=NetSuite;UID=user;PWD=pass'.format(dsn, uid, pwd), autocommit=True)
cursor=cnxn.cursor()
tables_list = []
for row in cursor.tables():
tables_list.append(row.table_name)
print (tables_list)
Однако при запуске приложения python в кластере я всегда получаю сообщение об ошибке: - Не удается открыть lib '/opt/netsuite/odbcclient/lib64/ivoa27.so; несмотря на то, что файл драйвера, все его зависимости (с помощью команды ldd) и все переменные пути, то есть $ LD_LIBRARY_PATH, $ ODBCINI и $ OASDK_ODBC_HOME, существует и настроен на общесистемный доступ (добавлен в файл / etc / environment), как показано ниже на все 3 узла:
PYTHON_APP_HOME = / home / admin / app /
LD_LIBRARY_PATH = / opt / netsuite / odbcclient / lib64
ODBCINI = / opt / netsuite / odbcclient / odbc64.ini
OASDK_ODBC_HOME / opt / netsuite odbcclient / lib64
Вот вывод команды ldd для зависимостей драйверов:
-rwxr-xr-x 1 root root 3277375 Jul 25 16:03 ivoa27.so
/opt/netsuite/odbcclient/lib64$ ldd /opt/netsuite/odbcclient/lib64/ivoa27.so
linux-vdso.so.1 (0x00007fff401a2000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fee1d589000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fee1d385000)
libicuuc.so.42 => /opt/netsuite/odbcclient/lib64/libicuuc.so.42 (0x00007fee1d12b000)
libicudata.so.42 => /opt/netsuite/odbcclient/lib64/libicudata.so.42 (0x00007fee1c0e6000)
libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007fee1bed8000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fee1bcb9000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fee1b930000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fee1b592000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fee1b37a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fee1af89000)
/lib64/ld-linux-x86-64.so.2 (0x00007fee1db3c000)
libaudit.so.1 => /lib/x86_64-linux-gnu/libaudit.so.1 (0x00007fee1ad60000)
libcap-ng.so.0 => /lib/x86_64-linux-gnu/libcap-ng.so.0 (0x00007fee1ab5b000)
Ниже показано, как эти шаги были выполнены в соответствии с инструкциями драйвера Netsuite README.txt, и драйвер ODBC настраивается одинаково для всех 3 узлов в ОС Ubuntu 18.04.
- Файлы / папки 64-битного драйвера Netsuite для Linux распаковываются и копируются в папку: $ cd / opt / netsuite / odbcclient / *. Весь этот каталог, подкаталог и файлы внутри имеют права доступа r + x.
- Установленные библиотеки $ sudo apt install unixodbc && apt-get install unixodbc-dev
- Выполненный сценарий / команда, предоставленная Netsuite из каталога / opt / netsuite / odbcclient: - $ source oaodbc64.sh (поскольку это оболочка bash). Это устанавливает такие же переменные, как показано выше.
- Из того же каталога / папки была запущена следующая команда для регистрации его как общесистемного драйвера:
$ sudo odbcinst -i -d -f /opt/netsuite/odbcclient/odbcinst.ini
который вернул сообщение как:
odbcinst: драйвер установлен. Счетчик использования увеличен до 1. Целевой каталог - / etc
odbcinst: Драйвер установлен. Счетчик использования увеличен до 1. Целевой каталог - / etc.
- Затем выполните команду ниже также для установки его как системного DSN: -
$ sudo odbcinst -i -s -l -f /opt/netsuite/odbcclient/odbc64.ini
После этого проверил каталог / etc, в котором были созданы / зарегистрированы файлы odbc.ini и odbcinst.ini. Оба файла * .ini также получили разрешение на выполнение для всех.
-rwxr-xr-x 1 root root 500 Jul 24 10:31 odbc.ini
-rwxr-xr-x 1 root root 199 Jul 24 10:31 odbcinst.ini
$odbcinst -j
unixODBC 2.3.4
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /opt/netsuite/odbcclient/odbc64.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
$odbcinst -q -d
[ODBC Drivers]
[NetSuite ODBC Drivers 8.1]
$odbcinst -q -s
[NetSuite]
[ODBC]
Я также могу подключаться с каждого отдельного узла через isql, а также путем локального запуска example.py через оболочку python.
$ isql -v 'NetSuite' user 'pass'
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
Но при запуске того же самого в кластере он всегда дает одну и ту же ошибку. Пожалуйста помоги. Я уверен, что чего-то не хватает.
Вот вывод файлов odbc.ini и odbcinst.ini из каталога / etc:
/etc$ more odbcinst.ini
[ODBC Drivers]
NetSuite ODBC Drivers 8.1=Installed
UsageCount=1
[NetSuite ODBC Drivers 8.1]
APILevel=1
ConnectFunctions=YYN
Driver=ivoa27.so
DriverODBCVer=03.52
FileUsage=0
SQLLevel=1
UsageCount=1
/etc$ more odbc.ini
[ODBC Data Sources]
NetSuite=NetSuite ODBC Drivers 8.1
[NetSuite]
Driver=/opt/netsuite/odbcclient/lib64/ivoa27.so
Description=Connect to your NetSuite account
Host=XXXXX.connect.api.netsuite.com
Port=1708
ServerDataSource=NetSuite.com
Encrypted=1
Truststore=/opt/netsuite/odbcclient/cert/ca3.cer
CustomProperties=AccountID=XXXXX;RoleID=XXXX
[ODBC]
Trace=0
IANAAppCodePage=4
TraceFile=odbctrace.out
TraceDll=/opt/netsuite/odbcclient/lib64/ddtrc27.so
InstallDir=/opt/netsuite/odbcclient
Пробовали другие вещи, которые не работали:
- Добавлены пути к переменным ODBC в .profile, .bashrc, / etc / profile, / etc / bash.bashrc, кроме / etc / environment.
- Изменил владельца папки / lib64 / и всех файлов в ней, а также файлов * .ini в / etc с root на admin.
- Создавая символические ссылки: sudo ln -s /etc/odbcinst.ini /usr/local/etc/odbcinst.ini sudo ln -s /etc/odbc.ini /usr/local/etc/odbc.ini
Спасибо !!