Bug 50603 - Не работает salt-api 3007
Summary: Не работает salt-api 3007
Status: NEW
Alias: None
Product: Sisyphus
Classification: Development
Component: salt-api (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 major
Assignee: Andrey Cherepanov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2024-06-11 13:47 MSK by Savenko Eugeny
Modified: 2024-06-18 14:54 MSK (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Savenko Eugeny 2024-06-11 13:47:51 MSK
После обновления пакетов salt-master c версии 3006 до 3007.0, salt-api при попытке отправки ему post-запроса авторизации выдает traceback.
Система ALT Server 10.2 (Mendelevium)
================================================================================
Пример запроса POST:
https://salt-api:8999/login
payload:
{
"client": "local",
"eauth": "pam",
"username": "user",
"password": "password"
}
================================================================================
Traceback:
{
 "status": 500,
 "return": "Traceback (most recent call last):
  File \"/usr/lib/python3/site-packages/salt/netapi/rest_cherrypy/app.py\", line 860, in hypermedia_handler
    ret = cherrypy.serving.request._hypermedia_inner_handler(*args, **kwargs)
  File \"/usr/lib/python3/site-packages/cherrypy/_cpdispatch.py\", line 54, in __call__
    return self.callable(*self.args, **self.kwargs)
  File \"/usr/lib/python3/site-packages/salt/netapi/rest_cherrypy/app.py\", line 1886, in POST
    token = self.auth.mk_token(creds)
  File \"/usr/lib/python3/site-packages/salt/auth/__init__.py\", line 594, in mk_token
    tdata = self._send_token_request(load)
  File \"/usr/lib/python3/site-packages/salt/auth/__init__.py\", line 523, in _send_token_request\n    with salt.channel.client.ReqChannel.factory(
  File \"/usr/lib/python3/site-packages/salt/channel/client.py\", line 55, in factory
    return SyncWrapper(
  File \"/usr/lib/python3/site-packages/salt/utils/asynchronous.py\", line 77, in __init__
    self.obj = cls(*args, **kwargs)
  File \"/usr/lib/python3/site-packages/salt/channel/client.py\", line 137, in factory
    transport = salt.transport.request_client(opts, io_loop=io_loop)
  File \"/usr/lib/python3/site-packages/salt/transport/base.py\", line 59, in request_client
    return salt.transport.zeromq.RequestClient(opts, io_loop=io_loop)
  File \"/usr/lib/python3/site-packages/salt/transport/zeromq.py\", line 1082, in __init__
    self.sending = asyncio.Lock()
  File \"/usr/lib64/python3.9/asyncio/locks.py\", line 81, in __init__
    self._loop = events.get_event_loop()
  File \"/usr/lib64/python3.9/asyncio/events.py\", line 642, in get_event_loop
    raise RuntimeError('There is no current event loop in thread %r.'
RuntimeError: There is no current event loop in thread 'CP Server Thread-5'.
"}
Comment 1 Tatyana Gagina 2024-06-14 12:26:10 MSK
Доброго времени суток! 
Прошу предоставить дополнительную информацию:
1) Шаги по предварительной настройке (если были);
2) Были ли доустановлены какие-либо пакеты ещё;
3) Подробные шаги воспроизведения;
4) Были ли проблемы при выполнении других запросов.
Comment 2 Savenko Eugeny 2024-06-14 14:06:30 MSK
(Ответ для Tatyana Gagina на комментарий #1)
> Доброго времени суток! 
> Прошу предоставить дополнительную информацию:
> 1) Шаги по предварительной настройке (если были);
> 2) Были ли доустановлены какие-либо пакеты ещё;
> 3) Подробные шаги воспроизведения;
> 4) Были ли проблемы при выполнении других запросов.

Здравствуйте!
1) Настравиался только salt api добавлением в папку /etc/salt/master.d 2х конфигурационных файлов с минимальными настройками апи (salt-api.conf и eauth.conf)
2) Дополнительно пакетов не было установлено, проблема так же проявляется на новой «чистой» системе, с полным обновлением всех пакетов и ядра
3) шаги воспроизведения:  
   1. Установить salt-master, salt-api из стандартного репозитория со всеми зависимостями
   2. Произвести настройки salt-api согласно инструкции на офф сайте
   3. Создать post запрос с помощью postman с вышеуказанными параметрами 
4) Запросы не требующие токена доступа выполняются без ошибок

Проблема решается заменой папки /etc/usr/lib64/python3.9/asyncio  на аналогичную папку с другой машины с ОС Ubuntu версии 24.04 и python версии 3.10(Ответ для Tatyana Gagina на комментарий #1)
> Доброго времени суток! 
> Прошу предоставить дополнительную информацию:
> 1) Шаги по предварительной настройке (если были);
> 2) Были ли доустановлены какие-либо пакеты ещё;
> 3) Подробные шаги воспроизведения;
> 4) Были ли проблемы при выполнении других запросов.

Здравствуйте!
1) Настравиался только salt api добавлением в папку /etc/salt/master.d 2х конфигурационных файлов с минимальными настройками апи
2) Дополнительно пакетов не было установлено, проблема так же проявляется на новой «чистой» системе, с полным обновлением всех пакетов и ядра
3) шаги воспроизведения:  
   1. Установить salt-master, salt-api из стандартного репозитория со всеми зависимостями, создать пользователя “user” с паролем ”password” для использования salt-api, прописать в соответствии с инструкцией на офсайте разрешения пользователю в файле /etc/salt/master.d/eauth.conf, прописать базовые сетевые настройки salt-api в /etc/salt/master.d/salt-api.conf (порт в примере - 8999)
   2. Создать post запрос с помощью postman
4) Запросы не требующие получения токена доступа выполняются без ошибок

Проблема решается заменой папки /etc/usr/lib64/python3.9/asyncio  на аналогичную папку с другой машины с ОС Ubuntu версии 24.04 и/или установкой  python версии 3.10 (которой нет в публичных официальных репозиториях Alt Server)
Comment 3 Tatyana Gagina 2024-06-18 14:19:48 MSK
В качестве salt-master стенд:
P10 ALT SERVER x86-64

Поведение несколько другое.

Установлены пакеты salt-master salt-api

Версии: 
(на архивном репозитории)
python3-3.9.18-alt1 
salt-master-3006.4-alt0.p10.1
salt-api-3006.4-alt0.p10.1
(на текущем репозитории)
python3-3.9.18-alt1 
salt-api-3007.0-alt0.p10.1
salt-master-3007.0-alt0.p10.1

Добавлены 2 конфиг файла:
1) /etc/salt/master.d/salt-api.conf

Для этого файла ключ был создан так:
openssl genpkey -algorithm RSA -out /etc/pki/tls/private/key.key -aes256

Запрос на подписание сертификата создан так:
openssl req -new -key /etc/pki/tls/private/key.key -out /etc/pki/tls/certs/key.csr
и  самоподписанного сертификата:
openssl x509 -req -days 365 -in /etc/pki/tls/certs/key.csr -signkey /etc/pki/tls/private/key.key -out /etc/pki/tls/certs/key.crt

Настроена конфигурация Salt API в /etc/salt/master.d/salt-api.conf
rest_cherrypy:
  port: 8999
  host: 10.88.*.* (ip сервера)
  ssl_crt: /etc/pki/tls/certs/key.crt (здесь  указать свой серт)
  ssl_key: /etc/pki/tls/private/key.key (здесь  указать свой ключ)

2)  /etc/salt/master.d/eauth.conf
external_auth:
  pam:
    test:
      - .*
      - '@wheel'
      - '@runner'
      - '@jobs'

Здесь пользователь test c установленным паролем (password).

Перезапущен Salt Master, чтобы изменения вступили в силу:
# systemctl restart salt-master

После рестарта
# ps aux | grep salt
_avahi      2361  0.1  0.1   8364  4860 ?        Ss   11:18   0:01 avahi-daemon: running [salt-2.local]
root        4787 86.5  2.1  76856 64892 ?        Rs   11:33   0:01 /usr/bin/python3 /usr/bin/salt-master
root        4857  0.0  0.0   6060  2040 pts/0    S+   11:33   0:00 grep --color=auto salt

Проверено, сервисы запущены:
# systemctl status salt-master
# systemctl status salt-api
active (running)

  Сервер пингуется:
   ping 10.88.*.*
 PING 10.88.*.* (10.88.*.*) 56(84) bytes of data.
64 bytes from 10.88.*.*: icmp_seq=1 ttl=64 time=0.073 ms
64 bytes from 10.88.*.*: icmp_seq=2 ttl=64 time=0.072 ms
.........

Выполнен POST запрос:
curl -X POST http://целевой_ip_сервера:8999/login -H "Content-Type: application/json" -d '{
"client": "local",
"eauth": "pam",
"username": "user",
"password": "password"
}'

Проверялось также без использования сертификата (с параметром --insecure):
curl -X POST https://10.88.*.*:8999/login -H "Content-Type: application/json" -d '{
"client": "local",
"eauth": "pam",
"username": "user",
"password": "password"
}' --insecure

Результат: запрос не выполнен.
Причина: порт 8999 не прослушивается, возможно, блокируется службами.
Доступность порта проверена так:
telnet 10.88.*.* 8999

firewall отключен.

curl: (7) Failed to connect to 10.88.*.* port 8999 after 0 ms: Couldn't connect to server
Детали: поведение на архивном репозитории (с версией salt-master-3006.4-alt0.p10.1 и на текущей  версии репозитория с версией salt-api-3007.0-alt0.p10.1)
Рестарт сервисов salt-api/salt-master не помог, как и перенастройка сервера:
# systemctl restart salt-api
# systemctl restart salt-master

После обновления salt-master c версии 3006 до 3007 аналогично.

Детали:
# journalctl -u salt-api
июн 14 11:27:13 salt systemd[1]: Starting The Salt API...
июн 14 11:27:14 salt systemd[1]: Started The Salt API.
июн 14 11:27:25 salt systemd[1]: salt-api.service: Deactivated successfully.
июн 14 11:27:25 salt systemd[1]: salt-api.service: Consumed 1.357s CPU time.
-- Boot 7cf391fe8b304928993ce257c2ff02c3 --
июн 18 13:27:03 salt systemd[1]: Starting The Salt API...
июн 18 13:27:03 salt systemd[1]: Started The Salt API.
июн 18 13:27:05 salt salt-api[6472]: Enter PEM pass phrase:
июн 18 13:27:05 salt salt-api[6472]: [ERROR   ] [18/Jun/2024:13:27:05] ENGINE Error in 'start' listener <bound method Server.start of <cherrypy._cpserver.S>
июн 18 13:27:05 salt salt-api[6472]: Traceback (most recent call last):
июн 18 13:27:05 salt salt-api[6472]:   File "/usr/lib/python3/site-packages/cherrypy/process/wspbus.py", line 230, in publish
июн 18 13:27:05 salt salt-api[6472]:     output.append(listener(*args, **kwargs))
июн 18 13:27:05 salt salt-api[6472]:   File "/usr/lib/python3/site-packages/cherrypy/_cpserver.py", line 179, in start
июн 18 13:27:05 salt salt-api[6472]:     self.httpserver, self.bind_addr = self.httpserver_from_self()
июн 18 13:27:05 salt salt-api[6472]:   File "/usr/lib/python3/site-packages/cherrypy/_cpserver.py", line 170, in httpserver_from_self
июн 18 13:27:05 salt salt-api[6472]:     httpserver = _cpwsgi_server.CPWSGIServer(self)
июн 18 13:27:05 salt salt-api[6472]:   File "/usr/lib/python3/site-packages/cherrypy/_cpwsgi_server.py", line 99, in __init__
июн 18 13:27:05 salt salt-api[6472]:     self.ssl_adapter = adapter_class(
июн 18 13:27:05 salt salt-api[6472]:   File "/usr/lib/python3/site-packages/cheroot/ssl/builtin.py", line 226, in __init__
июн 18 13:27:05 salt salt-api[6472]:     self.context.load_cert_chain(certificate, private_key)
июн 18 13:27:05 salt salt-api[6472]: OSError: [Errno 22] Invalid argument
июн 18 13:27:05 salt salt-api[6472]: [ERROR   ] [18/Jun/2024:13:27:05] ENGINE Shutting down due to error in start listener:
июн 18 13:27:05 salt salt-api[6472]: Traceback (most recent call last):

# systemctl status salt-api
● salt-api.service - The Salt API
     Loaded: loaded (/lib/systemd/system/salt-api.service; enabled; vendor preset: disabled)
     Active: active (running) since Tue 2024-06-18 13:27:03 MSK; 3min 55s ago
       Docs: man:salt-api(1)
             https://docs.saltproject.io/en/latest/contents.html
   Main PID: 6466 (salt-api)
      Tasks: 2 (limit: 3545)
     Memory: 49.1M
        CPU: 24.512s
     CGroup: /system.slice/salt-api.service
             └─ 6466 /usr/bin/python3 /usr/bin/salt-api

июн 18 13:30:55 salt salt-api[6692]:   File "/usr/lib/python3/site-packages/cheroot/ssl/builtin.py", line 226, in __init__
июн 18 13:30:55 salt salt-api[6692]:     self.context.load_cert_chain(certificate, private_key)
июн 18 13:30:55 salt salt-api[6692]: OSError: [Errno 22] Invalid argument
июн 18 13:30:55 salt salt-api[6692]: [ERROR   ] [18/Jun/2024:13:30:55] ENGINE Shutting down due to error in start listener:
июн 18 13:30:55 salt salt-api[6692]: Traceback (most recent call last):
июн 18 13:30:55 salt salt-api[6692]:   File "/usr/lib/python3/site-packages/cherrypy/process/wspbus.py", line 268, in start
июн 18 13:30:55 salt salt-api[6692]:     self.publish('start')


На Sisyphus аналогично (salt-master-3007.0-alt1).
_________
У пользователя:
Ошибка с кодом 500 ("status": 500) указывают на внутренние проблемы на сервере (по необходимости, выслать вывод journalctl -u salt-api -xe).
Comment 4 Savenko Eugeny 2024-06-18 14:54:33 MSK
Добрый день, Татьяна!
В вашем запросе некорректно указан пользователь. 
Так как в конфиге 
/etc/salt/master.d/eauth.conf
external_auth:
  pam:
    test:
      - .*
      - '@wheel'
      - '@runner'
      - '@jobs'
указан пользователь 'test', то запрос curl необходимо выполнять из-под пользователя test, а также этот же пользователь должен быть создан в системе с помощью useradd
Также, если при выполнении POST-запроса не используется https, то в конфигурации
/etc/salt/master.d/salt-api.conf
необходимо попробовать исключить ssl
rest_cherrypy:
  port: 8999
  host: 10.88.*.* (ip сервера)
  ssl_crt: /etc/pki/tls/certs/key.crt (здесь  указать свой серт)
  ssl_key: /etc/pki/tls/private/key.key (здесь  указать свой ключ)
  disable_ssl: True

Само подключение проверено и работает на версиях 3006.4 и 3007.0 , не работает авторизация на версии 3007.0
Причину неработоспособности я указал в Комментарии #2