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 .

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 = ['frodo@middleearth.com']

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')

# [frodo@middleearth.com] Executing task 'copy'
# [frodo@middleearth.com] run: mkdir -p /home/frodo/tmp
# [frodo@middleearth.com] put: testdirectory/HELLO -> \
#     /home/frodo/tmp/testdirectory/HELLO
# [frodo@middleearth.com] put: testdirectory/WORLD -> \
#     /home/frodo/tmp/testdirectory/WORLD
# ...

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')

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 .


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.