2012-10-26 2 views
18

Fabric을 사용하여 내 SSH 워크 플로를 모방하여 웹 응용 프로그램을 배포 할 때 문제가 있습니다.Fabric의 사용자 전환

  1. SSH 루트 사용자를 사용 : 나는 서버에 SSH 때

    여기에 명령을 내 일반적인 흐름이다. ssh를 [email protected]

  2. 스위치 웹 사용자 : SU - 웹
  3. 디렉토리를 변경 : CD/SRV/웹/자극은/
  4. 시작 VIRTUALENV abc_project : 자식 풀 원산지 : abc_env
  5. 자식 풀 수행을 workon -m는
  6. 실행을 다른 스크립트를 구축 build_stuff :
  7. 실행을 스크립트를 마스터 내가 패브릭에서 배포 스크립트로이 작성하는 노력

./run 나는 때의 쉘 출력을 얻을 u - web이 입력되었습니다. 스크립트를 계속하려면 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) 

... 한 가지 더있다 :

가 여기 내 스크립트의 아니, 난 처음에 웹으로 로그인 할 수 없습니다, 나는 루트로 로그인해야합니다. 루트 사용자가 아닌 virtualenv가있는 것은 웹 사용자입니다.

답변

12

먼저 다른 사용자가 명령을 실행할 때 sudo을 사용해야합니다. 둘째, workon은 현재 쉘에 대한 환경 변수를 설정합니다. fabric은 모든 명령에 대해 새 쉘을 호출하므로 모든 명령에 workon rhino_env을 실행해야합니다. 여기서 virtualenv (즉, 접두사)가 필요합니다. 이 편집을을 yor 코드는 다음과 같아야합니다

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

감사합니다. 나는 웹 사용자를 사용하여 git 명령을 실행하는 것을 생각하지 않았다. 나는 대신 git 명령 앞에'su - web'을 사용하려고 노력했다. 고마워요 백만 ​​mechmind! – Mark

3

한 가지 가능한 솔루션은 su으로 원격 사용자를 변경하는 대신 sudo 작업을 사용하는 것입니다.

3

방법을 그래도 한 번만이 당신은 otheruser의 암호를 입력하라는 메시지가 표시됩니다

from fabric.api import settings 

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

함께 얻을 수 있습니다. 따라서 sudo su otheruser과 같지 않습니다. root는 암호없이 사용자 계정에 로그인하지만, 한 번만 암호를 입력하면 사용자간에 전환 할 수 있습니다.

+1

한번 맹세 컨데! 프로비저닝 작업이 중단되었습니다. –

관련 문제