Я поддерживаю небольшое унаследованное приложение 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)