फैब्रिक का उपयोग करके किसी निर्देशिका को दूरस्थ मशीन में कैसे कॉपी करूं?


79

मेरे पास मेरी स्थानीय मशीन पर एक निर्देशिका है जिसे मैं फैब्रिक का उपयोग करके एक दूरस्थ मशीन (और इसका नाम बदलकर) की नकल करना चाहूंगा। मुझे पता है कि मैं फ़ाइल का उपयोग करके कॉपी कर सकता हूं put(), लेकिन एक निर्देशिका के बारे में क्या। मुझे पता है कि यह scp का उपयोग करने के लिए काफी आसान है , लेकिन मैं इसे अपने भीतर से करना पसंद करूंगा fabfile.py

जवाबों:


113

आप putउस के लिए भी उपयोग कर सकते हैं (कम से कम 1.0.0 में):

local_pathएक रिश्तेदार या निरपेक्ष स्थानीय फ़ाइल या निर्देशिका पथ हो सकता है, और इसमें शेल-स्टाइल वाइल्डकार्ड शामिल हो सकते हैं , जैसा कि पायथन ग्लोब मॉड्यूल द्वारा समझा जाता है । टिल्ड विस्तार (जैसा कि os.path.expanduser द्वारा कार्यान्वित किया जाता है) भी किया जाता है।

देखें: http://docs.fabfile.org/en/1.0.0/api/core/operations.html#fabric.operab.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: एक (परीक्षण) उदाहरण जोड़ा गया है, लेकिन वास्तव में यह सिर्फ वेनिला है fab, कोई चाल नहीं। यदि लक्ष्य निर्देशिका पहले से मौजूद नहीं हैं, तो आपको त्रुटियां मिलेंगी - इसलिए मैंने mkdir -pपहले एक सरल को शामिल किया था put। (लेकिन अन्य उपनिर्देशिकाएं, जो testdirectoryदूरस्थ मशीन पर स्वचालित रूप से बनाई गई इच्छा से नीचे हैं )।
मिकू

धन्यवाद जो बहुत मददगार है।
गाविसकोन_मन १५'११ को १_:०२

putकाम कर रहा है। क्या यह स्रोत मशीन पर संपीड़ित के साथ फ़ोल्डर की प्रतिलिपि बनाने और दूरस्थ मशीन पर डीकंप्रेस का समर्थन करेगा।
राम इदवलपति

32

मैं प्रोजेक्ट टूल्स मॉड्यूल भी देखूंगा: fabric.contrib.project डॉक्यूमेंटेशन

इसमें एक upload_projectफ़ंक्शन है जो एक स्रोत और लक्ष्य निर्देशिका लेता है। इससे भी बेहतर, एक rsync_projectफ़ंक्शन है जो rsync का उपयोग करता है। यह अच्छा है क्योंकि यह केवल उन फ़ाइलों को अपडेट करता है जो बदल गई हैं और यह "बहिष्कृत" जैसे अतिरिक्त आर्गन्स को स्वीकार करता है जो आपकी .gitनिर्देशिका को छोड़कर जैसी चीजों को करने के लिए अच्छा है ।

उदाहरण के लिए:

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,, यह स्पष्ट नहीं है कि यह दोनों तरीकों से काम करता है)।
बेन्ज़की

: मैं एक सूची में बाहर रखा dir रैप करने के लिए यह काम करने के लिए पाने के लिए थाexclude=['.git']
ryantuck

17

फैब्रिक 2 का उपयोग करने वालों के लिए, putअब केवल फाइलों को डायरेक्टरी अपलोड नहीं कर सकते। इसके अलावा, rsync_projectअब मुख्य फैब्रिक पैकेज का हिस्सा नहीं है। 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 आप फ़ाइल स्थानांतरित करने के लिए पुट ऑप्शन का उपयोग करने पर कोई उदाहरण साझा कर सकते हैं?
अनीश

@ फ़र्न putफैब्रिक में अपलोड नहीं कर सकता है। यदि आप फैब्रिक 1 का उपयोग कर रहे हैं, तो कृपया स्वीकृत उत्तर देखें। फैब्रिक 2 के साथ, मैं उत्तर में दिए गए उदाहरण का उपयोग करते हुए उपयोग करता हूं rsync
TGO

0

TGO के उत्तर पर विस्तार करते हुए, यदि आप इसे विंडोज सिस्टम पर उपयोग करना चाहते हैं, तो आपको cygwin जैसे rsync के स्रोत की आवश्यकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.