Переключение пользователя в 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.
Ответы
Ответ 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, только каждый раз вводить каждый пароль