python - tutorial - fabric2
¿Cómo creo un nuevo archivo en un host remoto en tejido(herramienta de implementación de python)? (4)
Lo que hago es tener el archivo localmente como algo así como "app.wsgi.template".
Luego uso tokens en el archivo, como:
import sys, os
sys.path.insert(0, "/ruby/$HOST$/www/$HOST$/django-projects")
sys.path.insert(0, "/ruby/$HOST$/www/$HOST$/django-projects/project")
import django.core.handlers.wsgi
os.environ[''DJANGO_SETTINGS_MODULE''] = ''project.settings''
application = django.core.handlers.wsgi.WSGIHandler()
Utilizo la estructura para "colocar" el archivo en el host remoto, luego uso "sed" (o funciones equivalentes en Python) para reemplazar los tokens "$ HOST $" y "$ USER $" con los valores que quiero.
run("sed -i backup -e ''s/$USER$/%s'' -e ''s/$HOST$/%s'' app.wsgi.template" % (user, host))
run("mv app.wsgi.template app.wsgi")
Me gustaría crear un archivo con el nombre passenger_wsgi.py en un host remoto. Me gustaría usar la siguiente cadena para crear el contenido del archivo:
''''''
import sys, os
sys.path.insert(0, "/ruby/%s/www/%s/django-projects")
sys.path.insert(0, "/ruby/%s/www/%s/django-projects/project")
import django.core.handlers.wsgi
os.environ[''DJANGO_SETTINGS_MODULE''] = ''project.settings''
application = django.core.handlers.wsgi.WSGIHandler()
'''''' % (user,host,user,host)
Las variables de usuario y host serían parámetros de la función fabric.
Soy un novato total en cualquier tipo de manipulación de archivos en Python, pero tampoco estoy realmente seguro de cuál debería ser el procedimiento en la estructura. ¿Debo crear el archivo localmente y luego cargarlo con el comando put (y luego eliminar la versión local)? ¿Debo crear el archivo en el host remoto con un comando bash apropiado (usando la ejecución de fabric)? Si es así, entonces, ¿cuál es la mejor manera de lidiar con todo el "y ''en la cadena - se escapará la tela? ¿O debería estar abordando esto de alguna manera diferente?
Podría usar las funciones append()
o upload_template()
de fabric.contrib.files
StringIO con put funciona con un poco de edición. Prueba esto:
put(StringIO.StringIO(
''''''
import sys, os
sys.path.insert(0, "/ruby/%s/www/%s/django-projects")
sys.path.insert(0, "/ruby/%s/www/%s/django-projects/project")
import django.core.handlers.wsgi
os.environ[''DJANGO_SETTINGS_MODULE''] = ''project.settings''
application = django.core.handlers.wsgi.WSGIHandler()
'''''' % (user,host,user,host)), "remote-path")
Si tiene un problema con los permisos, intente esto:
put(StringIO.StringIO(
''''''
import sys, os
sys.path.insert(0, "/ruby/%s/www/%s/django-projects")
sys.path.insert(0, "/ruby/%s/www/%s/django-projects/project")
import django.core.handlers.wsgi
os.environ[''DJANGO_SETTINGS_MODULE''] = ''project.settings''
application = django.core.handlers.wsgi.WSGIHandler()
'''''' % (user,host,user,host)), "remote-path", use_sudo=True)
Utilice StringIO con put:
text = ''''''
import sys, os
sys.path.insert(0, "/ruby/%s/www/%s/django-projects")
sys.path.insert(0, "/ruby/%s/www/%s/django-projects/project")
import django.core.handlers.wsgi
os.environ[''DJANGO_SETTINGS_MODULE''] = ''project.settings''
application = django.core.handlers.wsgi.WSGIHandler()
'''''' % (user, host, user, host)
import StringIO
put(StringIO.StringIO(text), "remote-path")