как предоставить пользователю www-data доступ к солевому модулю Python? - PullRequest
0 голосов
/ 21 февраля 2019

Я поддерживаю небольшое унаследованное приложение php5 (на основе CodeIgniter), которое действует как пользовательский веб-интерфейс, позволяющий мне запускать солт-команды и планировать повторяющиеся задания.Веб-приложение запускает скрипты Python, которые вызывают соли API для выполнения команд.

Проблема, с которой я сталкиваюсь, заключается в том, что python генерирует UnboundLocalError, когда я пытаюсь перебрать результаты.Интересно, что эта проблема возникает только тогда, когда я запускаю скрипт python, используя пользователя www-data.Если я использую свою учетную запись администратора, скрипт работает нормально.

это не удается:

sudo su - www-data -s /bin/bash -c '/usr/bin/python /home/system/update-manager/check_reboot_status.py'

Traceback (most recent call last):
  File "/home/system/update-manager/check_reboot_status.py", line 43, in <module>
    main()
  File "/home/system/update-manager/check_reboot_status.py", line 34, in main
    for r in returns:
  File "/usr/lib/python2.7/dist-packages/salt/client/__init__.py", line 563, in cmd_batch
    salt.utils.versions.warn_until(
UnboundLocalError: local variable 'salt' referenced before assignment

это работает нормально:

sudo /usr/bin/python /home/system/update-manager/check_reboot_status.py
2019-02-21 12:12:04,456 INFO Started the check reboot status script...
2019-02-21 12:12:22,144 INFO Updated the 'Reboot Status' of 92 minions.
2019-02-21 12:12:22,144 INFO End of the check reboot status script.

Изначально я думал, что это связано сиз-за недостаточных прав, однако мой файл visudo предоставляет разрешение www-data для выполнения этой команды:

www-data ALL = NOPASSWD: /usr/bin/python /home/system/update-manager/check_reboot_status.py

Я запутался, что ошибка связана с переменной 'salt', так как я уверен, что модуль pythonустановлены;Ведь моя учетная запись администратора может выполнить скрипт без ошибок.Интересно, имеет ли это отношение к среде оболочки, в которой выполняется скрипт.Я не смог найти информацию об этом в php doc .

Что я оставил, чтобы попытаться или исследовать?Я скопировал приведенный ниже код Python и php для справки.

скрипт php:

$script = '/home/system/update-manager/check_reboot_status.py';

shell_exec('sudo /usr/bin/python ' . $script . '> /home/system/update-manager/logs/check_reboot_status.log 2>&1 &');

код Python

import salt.client
local = salt.client.LocalClient()

linux = 'G@os:Ubuntu'    

# Linux minions
cmd = '[ -f /var/run/reboot-required ] && echo 1 || echo 0'
returns = local.cmd_batch(linux, 'cmd.run', [cmd], bat='1', expr_form='compound')

for r in returns:
    count += 1
    for minion, reboot_required in r.iteritems():
        umb.change_reboot_status(minion, reboot_required)

1 Ответ

0 голосов
/ 28 февраля 2019

tl; dr: Непонимание сообщения об ошибке.Использование команды с / без sudo привело к двум различным модулям соли Python.Согласно документации API, только пользователь, запустивший salt на salt-master, может запускать команды, в данном случае: root.Исходный вопрос не соответствует описанной ситуации, так как python никогда не имел доступа к модулю, в противном случае возникла бы ошибка типа «ImportError: модуль с именем salt».

Возникла проблема с правами доступаэто скрывало реальную проблему.

Сначала я обнаружил, что при запуске python с двумя командами для загрузки использовались два разных файла:

$ sudo python
>>> import salt.client
>>> salt.client
<module 'salt.client' from' /home/support/.local/lib/python2.7/site-packages/salt/client/__init__.pyc'>

 sudo runuser -l www-data -s /bin/bash -c '/usr/bin/python
>>> import salt.client
>>> salt.client
<module 'salt.client' from '/usr/lib/python2.7/dist-packages/salt/client/__init__.pyc'>

Трассировка стека показала, что ошибка исходила из следующихblock: "salt.utils.versions.warn_until ()" выдал ошибку соли, показанную в вопросе, даже если этот пакет был импортирован в начале файла.

#/usr/lib/python2.7/dist-packages/salt/client/__init__.py
if 'expr_form' in kwargs:
            #import salt.utils.versions
--->        salt.utils.versions.warn_until(
                'Fluorine',
                'The target type should be passed using the \'tgt_type\' '
                'argument instead of \'expr_form\'. Support for using '
                '\'expr_form\' will be removed in Salt Fluorine.'
            )
            tgt_type = kwargs.pop('expr_form')

        import salt.cli.batc

При добавлении строки импорта (показанов комментарии) ошибка была устранена, однако на ее место пришла другая:

salt.exceptions.SaltClientError: Authentication error occurred.

Поскольку документация гласит: «Импорт и использование LocalClient должны выполняться на той же машине, что и Salt.Мастер, и это должно быть сделано с использованием того же пользователя, на котором работает Мастер соли. [...]). "Именно здесь я понял, что команды могут выполняться только с пользователем root.

...