繁体   English   中英

如何授予www-data用户访问python salt模块的权限?

[英]how to grant www-data user access to python salt module?

我正在维护一个小的旧版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模块。 毕竟我的管理员帐户可以正确执行脚本。 我想知道它是否与执行脚本的外壳环境有关。 我在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)

tl; dr:对错误消息的误解。 在有/没有sudo的情况下使用命令会导致两个不同的python salt模块。 根据API文档,只有在salt-master上启动salt的用户才能运行命令,在这种情况下为root。 原始问题与所描述的情况不符,因为python从未访问过该模块,否则将引发类似“ ImportError:No module named 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'>

堆栈跟踪显示该错误来自以下块:“ 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 Master在同一台计算机上进行,并且必须使用Salt Master在同一台计算机上进行操作。 这就是我意识到命令只能由root用户运行的地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM