Подтвердить что ты не робот

Переключение пользователя в Fabric

У меня проблема при использовании Fabric для имитации моего рабочего процесса SSH для развертывания моего веб-приложения.

Здесь мой обычный поток команд, когда я SSH на сервер:

  • SSH с использованием пользователя root. ssh [email protected]
  • Перейти на веб-пользователя: su - web
  • Изменить каталог: cd/srv/web/prod/abc_project
  • Запустить virtualenv: workon abc_env
  • Выполните git pull: git мастер создания тяги
  • Запустите script: build_stuff -m build
  • Запустите еще один script:./run

Я попытался написать это как разворачивание script в Fabric, и я получаю вывод оболочки при вводе su-web. Мне нужно нажать Ctrl-D, чтобы продолжить script. Я также не могу активировать свой virtualenv.... потому что: su - web успешно переключает пользователя на web, но из-за Ctrl-d (чтобы я мог продолжить Fabric script), он выходит из этого пользователя и обратно в корневой каталог.

Здесь мой script:

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.

4b9b3361

Ответ 1

Прежде всего, вы должны использовать sudo при выполнении команд под другим пользователем. Во-вторых, workon устанавливает переменные среды для текущей оболочки. Поскольку для каждой команды создается новая оболочка, вы должны запускать 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)

Ответ 2

Одним из возможных решений является использование sudo вместо изменения удаленного пользователя с помощью su.

Ответ 3

Как я достигаю этого,

from fabric.api import settings

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

Вам будет предложено ввести пароль otheruser, но только один раз. Таким образом, он не эквивалентен так sudo su otheruser, где root входит в учетную запись пользователя без пароля, но это простой способ переключения между пользователями в вашем script, только каждый раз вводить каждый пароль