Fabric을 사용하여 원격 시스템에 디렉토리를 복사하려면 어떻게합니까?


79

Fabric을 사용하여 원격 컴퓨터에 복사하고 이름을 바꾸려는 로컬 컴퓨터에 디렉터리가 있습니다. 을 사용하여 파일을 복사 할 수 있다는 것을 알고 put()있지만 디렉토리는 어떻습니까? scp를 사용하는 것이 충분히 쉽다는 것을 알고 있지만 fabfile.py가능하면 내에서 수행하는 것을 선호 합니다.

답변:


113

put(적어도 1.0.0에서) 사용할 수도 있습니다 .

local_path상대 또는 절대 로컬 파일 또는 디렉토리 경로 일 수 있으며 Python glob 모듈 에서 이해하는대로 쉘 스타일 와일드 카드를 포함 할 수 있습니다 . 물결표 확장 (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 = ['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
# ...

감사. 예외가 발생합니다 (디렉토리입니까). 예제의 가능성이 있습니까?
gaviscon_man

@gaviscon_man : (테스트 된) 예제를 추가했지만 실제로는 바닐라 fab이며 트릭은 없습니다. 대상 디렉토리가 이미에없는 경우, 오류를 얻을 것이다 - 나는 간단한 포함 있도록 mkdir -p전과를 put. (그러나 아래에있는 다른 하위 디렉터리 testdirectory는 원격 컴퓨터에 자동으로 생성됩니다.)
miku 2011 년

매우 도움이되어 감사합니다.
gaviscon_man 2011 년

put작동합니다. 소스 컴퓨터에서 압축을 사용하여 폴더 복사를 지원하고 원격 컴퓨터에서 압축을 풉니 다.
Ram Idavalapati

32

또한 프로젝트 도구 모듈 인 fabric.contrib.project 문서 도 살펴 보겠습니다.

이것은 upload_project소스 및 대상 디렉토리를 취하는 기능을 가지고 있습니다. 더 좋은 rsync_project점은 rsync를 사용 하는 함수입니다. 이것은 변경된 파일 만 업데이트하고 .git디렉토리를 제외하는 것과 같은 작업을 수행하는 데 유용한 "exclude"와 같은 추가 인수를 허용하기 때문에 좋습니다 .

예를 들면 :

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.project최신 버전 문서 : docs.fabfile.org/en/latest/api/contrib/project.html
lsh

보다 나은 방법 put/get. 예를 들어 라이브 웹 사이트에서 사용자 업로드를 가져 오는데도 완벽하게 작동합니다 ( upload=False, 두 가지 방식 모두에서 작동하는지 확실하지 않음).
benzkji

나는 이것을 작동시키기 위해 목록에서 제외 된 dir을 감싸 야했다 :exclude=['.git']
ryantuck 17 년

17

Fabric 2를 사용하는 경우 put더 이상 디렉토리를 업로드 할 수없고 파일 만 업로드 할 수 있습니다. 또한 rsync_project더 이상 기본 Fabric 패키지의 일부가 아닙니다. contrib패키지가 제거되었습니다 여기에 설명 된대로 . 이제의 rsync_project이름이으로 바뀌 었으며 rsync사용하려면 다른 패키지를 설치해야합니다.

pip install patchwork

이제 이미 서버에 대한 연결을 생성했다고 가정합니다.

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

rsync다음과 같이 사용할 수 있습니다 .

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

자세한 정보 는 패브릭 패치 워크 문서 를 참조하십시오.


rsync에 자동 비밀번호를 제공하는 방법이 있습니까?
pg2455

2
@ pg2455 예, connect_kwargs. 예 :cxn = fabric.Connection('username@server:22', connect_kwargs=dict(password='yourpass'))
TGO

@TGO 넣기 옵션을 사용하여 파일을 전송하는 예를 공유 할 수 있습니까?
Anish

@Anish put는 Fabric 2에서 업로드 할 수 없습니다. Fabric 1을 사용하는 경우 허용 된 답변을 참조하십시오. Fabric 2에서는 대답에 제공된 예제를 사용하여 rsync.
TGO

0

TGO의 답변을 확장하면 Windows 시스템에서 사용하려면 cygwin과 같은 rsync 소스가 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.