У меня есть каталог на моей локальной машине, который я хотел бы скопировать на удаленный компьютер (и переименовать его) с помощью Fabric. Я знаю, что могу скопировать файл с помощью put()
, но как насчет каталога. Я знаю это достаточно легко, используя scp, но я предпочел бы сделать это из моего fabfile.py
, если это возможно.
Как скопировать каталог на удаленную машину с помощью Fabric?
Ответ 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')