【问题标题】:how to grant www-data user access to python salt module?如何授予 www-data 用户访问 python salt 模块的权限?
【发布时间】: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


    【解决方案1】:

    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()”引发了问题中显示的 salt 错误,即使该包是在文件开头导入的。

    #/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.
    

    正如documentation 所述,“导入和使用 LocalClient 必须与 Salt Master 在同一台机器上完成,并且必须使用与 Salt Master 运行相同的用户来完成。[...])。” . 这就是我意识到这些命令只能以 root 用户运行的地方。

    【讨论】:

      猜你喜欢
      • 2014-12-09
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      相关资源
      最近更新 更多