簡體   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