Установка 64-битного драйвера ODBC NetSuite в кластере Ubuntu 18.04 дает ошибку: - Не удается открыть lib '/opt/netsuite/odbcclient/lib64/ivoa27.so

Пробегаюсь по этой проблеме уже 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.

  1. Файлы / папки 64-битного драйвера Netsuite для Linux распаковываются и копируются в папку: $ cd / opt / netsuite / odbcclient / *. Весь этот каталог, подкаталог и файлы внутри имеют права доступа r + x.
  2. Установленные библиотеки $ sudo apt install unixodbc && apt-get install unixodbc-dev
  3. Выполненный сценарий / команда, предоставленная Netsuite из каталога / opt / netsuite / odbcclient: - $ source oaodbc64.sh (поскольку это оболочка bash). Это устанавливает такие же переменные, как показано выше.
  4. Из того же каталога / папки была запущена следующая команда для регистрации его как общесистемного драйвера:

$ sudo odbcinst -i -d -f /opt/netsuite/odbcclient/odbcinst.ini

который вернул сообщение как:

odbcinst: драйвер установлен. Счетчик использования увеличен до 1. Целевой каталог - / etc
odbcinst: Драйвер установлен. Счетчик использования увеличен до 1. Целевой каталог - / etc.

  1. Затем выполните команду ниже также для установки его как системного 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

Пробовали другие вещи, которые не работали:

  1. Добавлены пути к переменным ODBC в .profile, .bashrc, / etc / profile, / etc / bash.bashrc, кроме / etc / environment.
  2. Изменил владельца папки / lib64 / и всех файлов в ней, а также файлов * .ini в / etc с root на admin.
  3. Создавая символические ссылки: sudo ln -s /etc/odbcinst.ini /usr/local/etc/odbcinst.ini sudo ln -s /etc/odbc.ini /usr/local/etc/odbc.ini

Спасибо !!


person ManiK    schedule 26.07.2020    source источник


Ответы (1)


ОБНОВЛЕНИЕ - РЕШЕНО !! Один важный шаг, которого нам не хватало, - это перезагрузка / перезапуск всех узлов, чтобы эти 3 переменные вступили в общесистемный эффект после этого. был добавлен в файл (ы) / etc / environment.

Чтобы провести расследование, мы напечатали ниже дополнительные сведения в нашем коде, чтобы убедиться, что это действительно 64-битная платформа / архитектура, драйверы и источники данных зарегистрированы и перечислены. Однако переменные по-прежнему показывали пробелы / ничего. Это подтвердило, что хотя переменный путь был установлен / действовал локально при запуске с отдельных узлов. Однако при запуске извне / через удаленный сеанс значения переменных не применялись.

import os
import pyodbc
import platform

print(platform.architecture())
print (pyodbc.drivers())
print(pyodbc.dataSources())
print(os.environ["LD_LIBRARY_PATH"])
print(os.environ["ODBCINI"])
print(os.environ["OASDK_ODBC_HOME"])

Перед перезагрузкой:

[2020-07-27 18:46:51,948] {logging_mixin.py:112} INFO - ('64bit', 'ELF')
[2020-07-27 18:46:51,949] {logging_mixin.py:112} INFO - ['ODBC Drivers', 'NetSuite ODBC Drivers 8.1']
[2020-07-27 18:46:51,950] {logging_mixin.py:112} INFO - {'NetSuite': '/opt/netsuite/odbcclient/lib64/ivoa27.so', 'ODBC': ''}
[2020-07-27 18:46:51,950] {logging_mixin.py:112} INFO - Error: 'LD_LIBRARY_PATH'

После перезагрузки:

[2020-07-28 06:11:59,961] {logging_mixin.py:112} INFO - ('64bit', 'ELF')
[2020-07-28 06:11:59,963] {logging_mixin.py:112} INFO - ['ODBC Drivers', 'NetSuite ODBC Drivers 8.1']
[2020-07-28 06:11:59,965] {logging_mixin.py:112} INFO - {'NetSuite': '/opt/netsuite/odbcclient/lib64/ivoa27.so', 'ODBC': ''}
[2020-07-28 06:11:59,965] {logging_mixin.py:112} INFO - /opt/netsuite/odbcclient/lib64
[2020-07-28 06:11:59,965] {logging_mixin.py:112} INFO - /opt/netsuite/odbcclient/odbc64.ini
[2020-07-28 06:11:59,965] {logging_mixin.py:112} INFO - /opt/netsuite/odbcclient/lib64
person ManiK    schedule 28.07.2020