examples python fabric

python - examples - Cambio de usuario en tela



pip install fabric (3)

Tengo un problema al usar Fabric para imitar el flujo de trabajo de SSH para implementar mi aplicación web.

Aquí está mi flujo habitual de comandos cuando SSH a un servidor:

  1. SSH utilizando usuario root. ssh [email protected]
  2. Cambiar a usuario web: su - web
  3. Cambie el directorio: cd / srv / web / prod / abc_project
  4. Iniciar virtualenv: workon abc_env
  5. Realizar git pull: git pull origin master
  6. Ejecuta un script: build_stuff -m build
  7. Ejecute otro script: ./run

Intenté escribir esto como un script de implementación en Fabric y obtengo una salida de shell cuando se ingresa a su - web. Tengo que pulsar Ctrl-D para continuar con el script. Tampoco puedo activar mi virtualenv .... porque: su - web cambia el usuario exitosamente a web pero debido a Ctrl-d (para que pueda continuar con el script de Fabric), cierra la sesión de ese usuario y vuelve a raíz.

Aquí está mi guión:

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)

... hay una cosa más: no, no puedo iniciar sesión como web inicialmente, tengo que iniciar sesión como root. Es el usuario web el que tiene virtualenv no el usuario root.


La forma en que lo logro es con

from fabric.api import settings with settings(user=''otheruser''): ...

Se le solicitará la contraseña de otro otheruser , aunque solo una vez. Por lo tanto, no es equivalente, por lo que sudo su otheruser , donde la raíz se registra en la cuenta de usuario sin una contraseña, pero es una forma sencilla de cambiar entre los usuarios en su script, solo escribiendo cada contraseña una vez


Primero que todo, debes usar sudo cuando ejecutes comandos bajo otro usuario. En segundo lugar, workon establece variables de entorno para el shell actual. Dado que fabric invoca un nuevo shell para cada comando, debe ejecutar workon rhino_env en cada comando, donde necesite virtualenv (es decir, como prefijo). Con estas ediciones el código yor debería verse así:

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)


Una posible solución es utilizar la operación sudo en lugar de cambiar el usuario remoto con su .