首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何授予www-data用户访问python salt模块的权限?

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

Stack Overflow用户
提问于 2019-02-21 19:27:04
回答 1查看 379关注 0票数 1

我正在维护一个小型的遗留php5应用程序(基于CodeIgniter),它充当一个salt web UI,允许我运行salt命令并安排重复的作业。web应用程序运行python脚本,这些脚本调用salt api来执行命令。

我面临的问题是,当我试图遍历结果时,python会抛出一个UnboundLocalError。有趣的是,这个问题只有在我使用www-data user运行python脚本时才会发生。如果我使用我的管理员帐户,脚本工作正常。

这将失败:

代码语言:javascript
复制
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

这可以很好地工作:

代码语言:javascript
复制
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权限来运行该命令:

代码语言:javascript
复制
www-data ALL = NOPASSWD: /usr/bin/python /home/system/update-manager/check_reboot_status.py

我很困惑这个错误是围绕着一个变量'salt',因为我确信python模块已经安装了;毕竟我的管理员帐户可以执行脚本而不会出现错误。我想知道这是否与执行脚本的shell环境有关。我在php doc中找不到有关这方面的信息。

我遗漏了什么可以尝试或调查?我复制了下面的python和php代码以供参考。

php脚本:

代码语言:javascript
复制
$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代码

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-28 20:43:49

tl;dr:对错误消息的误解。使用带有/不带有sudo的命令会导致两个不同的python盐模块。根据API文档,只有在salt-master上启动salt的用户才能运行命令,在本例中为: root。原始问题与描述的情况不匹配,因为python从未访问过该模块,否则将抛出类似"ImportError: No module named salt“的错误。

有一个权限问题掩盖了实际的问题。

首先,我发现使用这两个命令运行python需要加载两个不同的文件:

代码语言:javascript
复制
$ 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()“抛出了问题中显示的salt错误,尽管该包是在文件开头导入的。

代码语言:javascript
复制
#/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

通过添加导入行(显示在注释中),错误被解决了,但是,另一个行取代了它:

代码语言:javascript
复制
salt.exceptions.SaltClientError: Authentication error occurred.

正如documentation声明的那样:“导入和使用LocalClient必须在Salt Master所在的同一台机器上完成,并且必须使用Salt Master运行时所使用的同一用户来完成...)。”在这里,我意识到命令只能在root用户下运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54805995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档