2012-10-26 55 views
18

使用Fabric來模擬我的SSH工作流以部署我的Web應用程序時,出現問題。在Fabric中切換用戶

這是我平時的命令時,流我SSH連接到服務器:使用root用戶

  1. SSH。 SSH [email protected]
  2. 切換到網絡用戶:蘇 - 網絡
  3. 更改目錄:cd/SRV /網絡/生產/ abc_project
  4. 開始的virtualenv:workon abc_env
  5. 執行混帳拉:混帳拉原點掌握
  6. 運行腳本:build_stuff -m建立
  7. 運行另一個腳本:./run

我試着寫本作中,布料將部署腳本,我得到一個shell的輸出,當s您輸入了網頁。我必須按Ctrl-D來繼續腳本。我也無法激活我的virtualenv ....因爲:su-web已成功將用戶切換到web,但由於Ctrl-d(以便我可以繼續Fabric腳本),它將註銷該用戶並返回到根。

這裏是我的腳本:

env.user = 'root' 

@roles('web') 
def deploy(): 
    dev_path = '/srv/web/prod' 
    app_path = '/srv/web/prod/rhino' 
    workon = 'workon rhino_env' 
    with prefix('su - web'): 
     puts('Switched to `web` user') 
     with settings(warn_only=True): 
      run('kill -9 `cat /srv/web/run/rhino/rhino.pid`') 
      puts('Stopped rhino...') 
     with cd(app_path): 
      run('git reset --hard HEAD') 
      puts('Discarded all untracked and modified files') 
      run('git checkout master') 
      run('git pull origin master') 
      users = run('users') 
      puts('Output from `users` command: %s' % users) 
      run(workon) 
      run('build_assets -m build') 
     run('cd %(dev_path)s; chown -R web:ebalu rhino' % {'dev_path': dev_path}) 
     run('cd %(app_path)s; ./run' % {'app_path': app_path}) 
     pid = run('cat /srv/web/run/rhino/rhino.pid') 
     puts('Rhino started again with pid: %s.' % pid) 

...還有一兩件事:沒有,我最初不能登錄,網頁,我必須以root登陸。它是具有virtualenv而不是root用戶的Web用戶。

回答

12

首先,在其他用戶下執行命令時,應該使用sudo。其次,workon爲當前shell設置環境變量。由於fabric爲每個命令調用新的shell,因此您應該在需要virtualenv(即作爲前綴)的每個命令中運行workon rhino_env。有了這個編輯侑代碼應該是這樣的:

env.user = 'root' 

@roles('web') 
def deploy(): 
    dev_path = '/srv/web/prod' 
    app_path = '/srv/web/prod/rhino' 
    workon = 'workon rhino_env; ' 
    with settings(warn_only=True): 
     run('kill -9 `cat /srv/web/run/rhino/rhino.pid`') 
     puts('Stopped rhino...') 
    with cd(app_path): 
     sudo('git reset --hard HEAD', user='web') 
     puts('Discarded all untracked and modified files') 
     sudo('git checkout master', user='web') 
     sudo('git pull origin master', user='web') 
     users = run('users') 
     puts('Output from `users` command: %s' % users) 

     with prefix(workon): 
      sudo('build_assets -m build', user='web') 
    with cd(dev_path): 
     run('chown -R web:ebalu rhino') 

    with cd(app_path): 
     sudo('./run', user='web') 

    pid = run('cat /srv/web/run/rhino/rhino.pid') 
    puts('Rhino started again with pid: %s.' % pid) 
+0

非常感謝!我從來沒有想過使用Web用戶來運行git命令。我一直試圖在git命令前面使用'su-web'。感謝百萬計! – Mark

3

一種可能的解決方案是使用sudo操作,而不是使用su更改遠程用戶。

3

的方式我做到這一點是

from fabric.api import settings 

with settings(user='otheruser'): 
    ... 

系統將提示您爲otheruser密碼,雖然只有一次。所以它不是等效的,所以sudo su otheruser,其中root登錄到用戶帳戶沒有密碼,但是是一種簡單的方法來切換腳本中的用戶,每次只輸入一次密碼

+1

我發誓這工作了一次!我的供應任務現在已經中斷。 –