फैब्रिक का उपयोग करते समय ~ / .ssh / config में सूचीबद्ध होस्ट से कनेक्ट करना


83

मुझे Fabricमेजबानों को पहचानने में परेशानी हो रही है जो मेरे पास है ~/.ssh/config

मेरा fabfile.pyइस प्रकार है:

from fabric.api import run, env

env.hosts = ['lulu']

def whoami():
    run('whoami')

रनिंग $ fab whoamiदेता है:

[लुलु] रन: हूमी

घातक त्रुटि: लुलु के लिए नाम लुकअप विफल हुआ

नाम luluमेरी है ~/.ssh/configइस तरह,:

Host lulu
     hostname 192.168.100.100
     port 2100
     IdentityFile ~/.ssh/lulu-key

मेरा इसे हल करने के बारे में पहला विचार कुछ ऐसा जोड़ रहा lulu.luluहै /etc/hosts(मैं मैक पर हूँ), लेकिन फिर मुझे फैब्रिक में पहचान फ़ाइल में भी पास करना होगा - और मैं ~/.ssh/configअपनी तैनाती से अलग अपना प्रमाणीकरण (यानी ) रखना चाहूंगा ( यानी fabfile.py)।

साथ ही, संयोग से, यदि आप होस्ट फ़ाइल में होस्ट से कनेक्ट करने का प्रयास करते हैं, तो fabric.contrib.projects.rsync_project'पोर्ट्स' को स्वीकार करने के लिए प्रतीत नहीं होता है hosts.env(यानी यदि आप कनेक्ट करने की कोशिश करने के hosts.env = [lulu:2100]लिए कॉल करने के लिए rsync_projectलगता है lulu:21) का उपयोग करते हैं।

क्या कोई कारण है जो फैब्रिक इस luluनाम को नहीं पहचानता है ?

जवाबों:


145

संस्करण 1.4.0 के बाद से, फैब्रिक आपके ssh कॉन्फिग (आंशिक रूप से) का उपयोग करता है । हालाँकि, आपको इसे स्पष्ट रूप से सक्षम करने की आवश्यकता है

env.use_ssh_config = True

अपने फैबाइल के शीर्ष के पास कहीं। एक बार जब आप ऐसा कर लेते हैं, तो फैब्रिक को आपके ssh config ( ~/.ssh/configडिफ़ॉल्ट रूप से, या env.ssh_config_path) से पढ़ना चाहिए ।

एक चेतावनी: यदि आप 1.5.4 से अधिक पुराने संस्करण का उपयोग करते हैं, तो यदि env.use_ssh_configसेट किया गया है तो एक गर्भपात हो जाएगा, लेकिन कोई कॉन्फ़िगरेशन फ़ाइल मौजूद नहीं है। उस स्थिति में, आप एक वर्कअराउंड का उपयोग कर सकते हैं जैसे:

if env.ssh_config_path and os.path.isfile(os.path.expanduser(env.ssh_config_path)):
    env.use_ssh_config = True

इसका उत्तर मूल रूप से "स्वीकृत उत्तर पुराना है" के साथ शुरू हुआ था [क्योंकि यह पूर्व-1.4.0 व्यवहार का दस्तावेज था]। मैंने इस प्रस्तावना को हटा दिया है, क्योंकि मेरा उत्तर इसके बजाय स्वीकार किया गया था;) धन्यवाद!
आरबीपी

9

ध्यान दें कि ऐसा तब भी होता है जब नाम अंदर नहीं होता है /etc/hosts। मैं एक ही समस्या थी और दोनों उस फ़ाइल और करने के लिए होस्ट नाम जोड़ने के लिए किया था ~/.ssh/config


5

अद्यतन : यह उत्तर अब पुराना है


वर्तमान में .ssh / config फाइल के लिए फैब्रिक का समर्थन नहीं है। आप इन्हें एक फ़ंक्शन में तब सेट करने के लिए cli पर कॉल कर सकते हैं, जैसे: फैब उत्पादन कार्य; जहां उत्पादन उपयोगकर्ता नाम, होस्टनाम, पोर्ट और ssh पहचान सेट करता है।

जैसा कि rsync प्रोजेक्ट के लिए, अब पोर्ट सेटिंग की क्षमता होनी चाहिए, यदि नहीं, तो आप हमेशा स्थानीय ("rsync ...") चला सकते हैं क्योंकि अनिवार्य रूप से वही है जो योगदान कार्य करता है।


1
निजी कुंजी के पूर्ण पथ पर env.key_filename सेट करें। इसके अलावा अगर आप मुसीबत में हैं, तो इसके आसपास कुछ मुद्दों के लिए code.fabfile.org/issues/show/265 देखें ।
tobych

1
हाँ, यह अब समर्थन मिल गया है। (हालांकि यह 1.0 पूर्व था जब मैंने टिप्पणी की थी) बाद के पाठकों के लिए नोटिंग।
मॉर्गन

4

एक निम्नलिखित कोड का उपयोग कर सकते हैं विन्यास (मूल कोड से लिया गया: http://markpasc.typepad.com/blog/2010/04/loading-ssh-config-settings-for-fabric.html ):

from fabric.api import *
env.hosts = ['servername']

def _annotate_hosts_with_ssh_config_info():
    from os.path import expanduser
    from paramiko.config import SSHConfig

    def hostinfo(host, config):
        hive = config.lookup(host)
        if 'hostname' in hive:
            host = hive['hostname']
        if 'user' in hive:
            host = '%s@%s' % (hive['user'], host)
        if 'port' in hive:
            host = '%s:%s' % (host, hive['port'])
        return host

    try:
        config_file = file(expanduser('~/.ssh/config'))
    except IOError:
        pass
    else:
        config = SSHConfig()
        config.parse(config_file)
        keys = [config.lookup(host).get('identityfile', None)
            for host in env.hosts]
        env.key_filename = [expanduser(key) for key in keys if key is not None]
        env.hosts = [hostinfo(host, config) for host in env.hosts]

        for role, rolehosts in env.roledefs.items():
            env.roledefs[role] = [hostinfo(host, config) for host in rolehosts]

_annotate_hosts_with_ssh_config_info()

1
फैब्रिक 1.2+ sshलाइब्रेरी ( paramikoकांटा) का उपयोग करता है :try: \n from ssh.config import SSHConfig \n except ImportError: \n from paramiko.config import SSHConfig
jfs

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