Jak skopiować katalog na komputer zdalny za pomocą Fabric?

79

Mam katalog na komputerze lokalnym, który chciałbym skopiować na komputer zdalny (i zmienić jego nazwę) za pomocą Fabric. Wiem, że mogę skopiować plik za pomocą put(), ale co z katalogiem. Wiem, że użycie scp jest dość łatwe , ale wolałbym to zrobić od wewnątrz, fabfile.pyjeśli to możliwe.

gaviscon_man
źródło

Odpowiedzi:

113

Możesz również użyć putdo tego (przynajmniej w wersji 1.0.0):

local_pathmoże być względnym lub bezwzględnym plikiem lokalnym lub ścieżką do katalogu i może zawierać symbole wieloznaczne w stylu powłoki , zgodnie z rozumieniem modułu glob w języku Python . Wykonywane jest również rozszerzenie tyldy (zaimplementowane przez os.path.expanduser).

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


Aktualizacja: ten przykład działa dobrze (dla mnie) w wersji 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
źródło
Dzięki. Otrzymuję wyjątek (czy katalog) jest szansa na przykład?
gaviscon_man
@gaviscon_man: Dodano (przetestowany) przykład, ale tak naprawdę to tylko wanilia fab, żadnych sztuczek. Otrzymasz błędy, jeśli katalogi docelowe nie są jeszcze na miejscu - więc dołączyłem prosty plik mkdir -pprzed rozszerzeniem put. (Ale inne podkatalogi, które znajdują się pod testdirectorytestamentem automatycznie utworzonym na zdalnym komputerze).
miku
Dziękuję, że to bardzo pomocne.
gaviscon_man
putdziała. Czy będzie obsługiwać kopiowanie folderu z kompresją na komputerze źródłowym i dekompresję na komputerze zdalnym.
Ram Idavalapati
32

Przyjrzałbym się także modułowi Project Tools: fabric.contrib.project Documentation

Ma upload_projectfunkcję, która pobiera katalog źródłowy i docelowy. Co więcej, istnieje rsync_projectfunkcja korzystająca z rsync. Jest to fajne, ponieważ aktualizuje tylko te pliki, które się zmieniły i akceptuje dodatkowe argumenty, takie jak „wyklucz”, co jest przydatne do wykonywania takich czynności, jak wykluczanie .gitkatalogu.

Na przykład:

from fabric.contrib.project import rsync_project

def _deploy_ec2(loc):

    rsync_project(local_dir=loc, remote_dir='/var/www', exclude='.git')
Seth Gottlieb
źródło
2
fabric.contrib.projectdokumenty do najnowszej wersji: docs.fabfile.org/en/latest/api/contrib/project.html
lsh
dużo lepiej niż put/get. działa również doskonale do pobierania plików przesłanych przez użytkowników z aktywnych witryn internetowych ( upload=Falsenie jest oczywiste, że działa to w obie strony).
benzkji
Musiałem zawrzeć wykluczony reż na liście, aby to zadziałało:exclude=['.git']
ryantuck
17

Użytkownicy korzystający z Fabric 2 putnie mogą już przesyłać katalogów, tylko pliki. Ponadto rsync_projectnie jest już częścią głównego pakietu materiałów. contribOpakowanie zostało usunięte, jak wyjaśniono tutaj . Teraz rsync_projectzostał zmieniony na rsynci musisz zainstalować inny pakiet, aby móc go używać:

pip install patchwork

Zakładając, że już utworzyłeś połączenie ze swoim serwerem:

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

Możesz użyć rsyncjak poniżej:

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

Więcej informacji można znaleźć w dokumentacji tkaniny-patchwork .

TGO
źródło
czy istnieje sposób na zapewnienie automatycznego hasła do rsync?
pg2455
2
@ pg2455 Tak, używam connect_kwargs. Na przykład:cxn = fabric.Connection('username@server:22', connect_kwargs=dict(password='yourpass'))
TGO
@TGO Czy możesz podzielić się przykładem wykorzystania opcji put do przesłania pliku?
Anish
@Anish putnie może przesłać w Fabric 2. Jeśli używasz Fabric 1, zapoznaj się z zaakceptowaną odpowiedzią. W przypadku Fabric 2 posługuję się przykładem podanym w odpowiedzi, używając rsync.
TGO
0

rozszerzając odpowiedź TGO, potrzebujesz źródła rsync, takiego jak cygwin, jeśli chcesz go używać w systemie Windows.

Exis Zhang
źródło