Как скопировать каталог на удаленную машину с помощью Fabric?

У меня есть каталог на моей локальной машине, который я хотел бы скопировать на удаленный компьютер (и переименовать его) с помощью Fabric. Я знаю, что могу скопировать файл с помощью put(), но как насчет каталога. Я знаю это достаточно легко, используя scp, но я предпочел бы сделать это из моего fabfile.py, если это возможно.

Ответ 1

Вы можете использовать put для этого (по крайней мере, в 1.0.0):

local_path может быть относительным или абсолютным локальным файлом или каталогом и может содержать групповые символы оболочки, понятные Python glob. Также выполняется расширение Tilde (как реализовано os.path.expanduser).

Смотрите: http://docs.fabfile.org/en/1.0.0/api/core/operations.html#fabric.operations.put


Обновление: этот пример отлично работает (для меня) на 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
# ...

Ответ 2

Я бы также посмотрел на модуль Project Tools: fabric.contrib.project Документация

У этого есть функция upload_project, которая берет исходный и целевой каталог. Еще лучше, есть функция rsync_project, которая использует rsync. Это хорошо, потому что он только обновляет измененные файлы и принимает дополнительные аргументы, такие как "exclude", который хорош для выполнения таких действий, как исключение вашего каталога .git.

Например:

from fabric.contrib.project import rsync_project

def _deploy_ec2(loc):

    rsync_project(local_dir=loc, remote_dir='/var/www', exclude='.git')