Wie kopiere ich ein Verzeichnis mit Fabric auf einen Remotecomputer?

79

Ich habe ein Verzeichnis auf meinem lokalen Computer, das ich mit Fabric auf einen Remotecomputer kopieren (und umbenennen) möchte. Ich weiß, dass ich Dateien mit kopieren kann put(), aber was ist mit einem Verzeichnis? Ich weiß, dass es mit scp einfach genug ist , aber ich würde es vorziehen, fabfile.pywenn möglich aus meinem Inneren heraus .

gaviscon_man
quelle

Antworten:

113

Sie können auch dafür verwenden put(zumindest in 1.0.0):

local_pathkann eine relative oder absolute lokale Datei oder ein Verzeichnispfad sein und Platzhalter im Shell-Stil enthalten , wie dies vom Python- Glob- Modul verstanden wird . Eine Tilde-Erweiterung (wie von os.path.expanduser implementiert) wird ebenfalls durchgeführt.

Siehe: http://docs.fabfile.org/en/1.0.0/api/core/operations.html#fabric.operations.put


Update: Dieses Beispiel funktioniert (für mich) unter 1.0.0.:

from fabric.api import env
from fabric.operations import run, put

env.hosts = ['[email protected]']

def copy():
    # make sure the directory is there!
    run('mkdir -p /home/frodo/tmp')

    # our local 'testdirectory' - it may contain files or subdirectories ...
    put('testdirectory', '/home/frodo/tmp')

# [[email protected]] Executing task 'copy'
# [[email protected]] run: mkdir -p /home/frodo/tmp
# [[email protected]] put: testdirectory/HELLO -> \
#     /home/frodo/tmp/testdirectory/HELLO
# [[email protected]] put: testdirectory/WORLD -> \
#     /home/frodo/tmp/testdirectory/WORLD
# ...
miku
quelle
Vielen Dank. Ich erhalte eine Ausnahme (Ist ein Verzeichnis) eine Chance auf ein Beispiel?
gaviscon_man
@gaviscon_man: Ein (getestetes) Beispiel hinzugefügt, aber eigentlich ist es nur Vanille fab, keine Tricks. Sie erhalten Fehler, wenn die Zielverzeichnisse noch nicht vorhanden sind - daher habe ich ein einfaches mkdir -pvor dem eingefügt put. (Andere Unterverzeichnisse, die sich unter dem befinden, testdirectorywerden automatisch auf dem Remote-Computer erstellt.)
Miku
Danke, das ist sehr hilfreich.
gaviscon_man
putfunktioniert. Unterstützt es das Kopieren von Ordnern mit Komprimierung auf dem Quellcomputer und Dekomprimieren auf dem Remotecomputer?
Ram Idavalapati
32

Ich würde mir auch das Project Tools-Modul ansehen: Fabric.contrib.project Documentation

Dies hat eine upload_projectFunktion, die ein Quell- und ein Zielverzeichnis übernimmt. Noch besser ist, dass es eine rsync_projectFunktion gibt, die rsync verwendet. Dies ist hilfreich, da nur die geänderten Dateien aktualisiert werden und zusätzliche Argumente wie "ausschließen" akzeptiert werden. Dies ist hilfreich, wenn Sie beispielsweise Ihr .gitVerzeichnis ausschließen möchten .

Zum Beispiel:

from fabric.contrib.project import rsync_project

def _deploy_ec2(loc):

    rsync_project(local_dir=loc, remote_dir='/var/www', exclude='.git')
Seth Gottlieb
quelle
2
fabric.contrib.projectDokumente für die neueste Version: docs.fabfile.org/en/latest/api/contrib/project.html
lsh
viel besser als put/get. funktioniert auch perfekt zum Abrufen von Benutzer-Uploads von Live-Websites ( upload=Falsees ist nicht offensichtlich, dass es auf beide Arten funktioniert).
Benzkji
Ich musste das ausgeschlossene Verzeichnis in eine Liste exclude=['.git']
einbinden
15

Für diejenigen, die Fabric 2 verwenden, putkönnen keine Verzeichnisse mehr hochgeladen werden, sondern nur Dateien. Ist auch rsync_projectnicht mehr Teil des Fabric-Hauptpakets. Das contribPaket wurde entfernt, wie hier erläutert . Jetzt rsync_projectwurde in umbenannt rsyncund Sie müssen ein anderes Paket installieren, um es verwenden zu können:

pip install patchwork

Angenommen, Sie haben bereits eine Verbindung zu Ihrem Server hergestellt:

cxn = fabric.Connection('username@server:22')

Sie können rsyncwie folgt verwenden:

import patchwork.transfers
patchwork.transfers.rsync(cxn, '/my/local/dir', target, exclude='.git')

Weitere Informationen finden Sie in der Fabric-Patchwork-Dokumentation .

TGO
quelle
Gibt es eine Möglichkeit, rsync ein automatisches Passwort zu geben?
pg2455
2
@ pg2455 Ja, mit connect_kwargs. Zum Beispiel:cxn = fabric.Connection('username@server:22', connect_kwargs=dict(password='yourpass'))
TGO
@TGO Können Sie ein Beispiel für die Verwendung der Put-Option zum Übertragen von Dateien nennen?
Anish
@Anish putkann in Fabric 2 nicht hochgeladen werden. Wenn Sie Fabric 1 verwenden, lesen Sie bitte die akzeptierte Antwort. Bei Fabric 2 verwende ich das in der Antwort angegebene Beispiel mit rsync.
TGO
0

Um die Antwort von TGO zu erweitern, benötigen Sie eine Rsync-Quelle wie Cygwin, wenn Sie sie auf einem Windows-System verwenden möchten.

Exis Zhang
quelle