【发布时间】:2019-02-28 20:43:48
【问题描述】:
我正在维护一个小型遗留 php5 应用程序(基于 CodeIgniter),它充当 salt web UI,允许我运行 salt 命令并安排重复作业。 Web 应用程序运行 python 脚本,这些脚本调用 salt api 来执行命令。
我面临的问题是,当我尝试遍历结果时,python 会抛出 UnboundLocalError。有趣的是,这个问题只发生在我使用 www-data 用户运行 python 脚本时。如果我使用我的管理员帐户,脚本可以正常工作。
这失败了:
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模块;毕竟我的管理员帐户可以毫无错误地执行脚本。我想知道它是否与执行脚本的 shell 环境有关。我在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)
【问题讨论】:
标签: php python python-2.7 codeigniter salt