2012-10-26 34 views
18

Tôi gặp sự cố khi sử dụng Fabric để bắt chước luồng công việc SSH của mình để triển khai ứng dụng web của mình.Chuyển người dùng trong Fabric

Dưới đây là dòng chảy bình thường của tôi về các lệnh khi tôi SSH đến một máy chủ:

  1. SSH sử dụng tài khoản root. ssh [email protected]
  2. Đổi thành người sử dụng web: su - web
  3. Thay đổi thư mục: cd/srv/web/prod/abc_project
  4. Bắt đầu virtualenv: workon abc_env
  5. Thực hiện git pull: git pull gốc nắm vững
  6. Chạy một kịch bản: build_stuff -m xây dựng
  7. Chạy kịch bản khác: ./run

tôi cố gắng để viết những dòng này như một kịch bản triển khai trong vải và tôi nhận được một sản lượng vỏ khi s u - web được nhập. Tôi phải nhấn Ctrl-D để tiếp tục kịch bản. Tôi cũng không thể kích hoạt virtualenv của tôi .... vì: su - web chuyển thành công người dùng thành web nhưng vì Ctrl-d (để tôi có thể tiếp tục tập lệnh Fabric), nó đăng xuất khỏi người dùng đó và quay lại nguồn gốc.

Dưới đây là kịch bản của tôi:

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) 

... có một điều nữa: Không, tôi không thể đăng nhập như web ban đầu, tôi phải đăng nhập như là root. Đó là người dùng web có virtualenv không phải là người dùng root.

Trả lời

12

Trước hết, bạn nên sử dụng sudo khi thực hiện lệnh dưới người dùng khác. Thứ hai, workon đặt biến môi trường cho trình bao hiện tại. Vì vải gọi vỏ mới cho mọi lệnh, bạn nên chạy workon rhino_env trong mọi lệnh, tại đó bạn cần virtualenv (tức là tiền tố). Với điều này chỉnh sửa đang Yor sẽ trông như thế này:

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

Cảm ơn rất nhiều! Tôi không bao giờ nghĩ đến việc chạy lệnh git bằng cách sử dụng người dùng web. Tôi cố gắng sử dụng 'su - web' trước các lệnh git thay vào đó. Cảm ơn một triệu mechmind! – Mark

3

Một giải pháp có thể là sử dụng thao tác sudo thay vì thay đổi người dùng từ xa bằng su.

3

Con đường tôi đạt được điều này là với

from fabric.api import settings 

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

Bạn sẽ được nhắc nhập mật khẩu của otheruser, dù chỉ một lần. Vì vậy, nó không tương đương như vậy sudo su otheruser, nơi gốc đăng nhập vào tài khoản người dùng mà không có mật khẩu, nhưng là cách đơn giản để chuyển đổi giữa người dùng trong tập lệnh của bạn, chỉ nhập từng mật khẩu một lần

+1

Tôi thề là đã từng làm việc một lần! Nhiệm vụ cấp phép của tôi hiện đã bị hỏng. –

Các vấn đề liên quan