फैब्रिक के साथ SSH कीफाइल का उपयोग करना


100

SSH कीफ़ाइल्स (उदाहरण के लिए, Amazon EC2 उदाहरण) का उपयोग करके दूरस्थ होस्ट से कनेक्ट करने के लिए आप फैब्रिक को कैसे कॉन्फ़िगर करते हैं?

जवाबों:


69

यहाँ यह भी ध्यान देने योग्य है कि आप इसके लिए कमांड लाइन आर्ग्स का उपयोग कर सकते हैं:

fab command -i /path/to/key.pem [-H [user@]host[:port]]

150

SSH कीफाइल उपयोग के काम के उदाहरण के साथ एक साधारण फैफाइल ढूंढना किसी कारण से आसान नहीं है। मैंने इसके बारे में एक ब्लॉग पोस्ट लिखा ( एक मेल खाने वाले के साथ )।

असल में, उपयोग कुछ इस तरह से होता है:

from fabric.api import *

env.hosts = ['host.name.com']
env.user = 'user'
env.key_filename = '/path/to/keyfile.pem'

def local_uname():
    local('uname -a')

def remote_uname():
    run('uname -a')

महत्वपूर्ण हिस्सा env.key_filenameपर्यावरण चर स्थापित कर रहा है, ताकि कनेक्ट करते समय पैरामिको कॉन्फ़िगरेशन इसके लिए देख सके।


4
व्यवहार में यह बेहतर उत्तर है।
पंचकूर

3
env.key_filename एक कनेक्शन के लिए कई कीफाइल की कोशिश करने के लिए तार की एक सूची हो सकती है
कार्ल जी।

मैं का उपयोग कर अपने कार्यों में से एक में प्रोग्राम के रूप में कुंजी की स्थापना की गई थी settingsसंदर्भ प्रबंधक और जब तक मैं बदल यह key_filename पहचान करने के लिए नहीं मिल सका key_filename='/path/to/key'करने के लिए key_filename=['/path/to/key']तो किसी और को परेशानी हो रही है, तो उस key_filename कुंजी की एक सूची बनाने इसे ठीक कर सकता है। यह फैब 1.10.1 और Paramiko 1.15.2 के साथ है
Jaymon

2
@AseemHegshetye, इसे लेटेस्ट फैब्रिक में हटा दिया गया था। यह उत्तर फैब्रिक 1. के लिए है।
Iulian Onofrei

1
मैं आयात के बजाय स्पष्ट आयात को प्राथमिकता देता हूँ
मिट

64

फैब्रिक 1.4 के रूप में उपलब्ध एक और शांत सुविधा - फैब्रिक अब एसएसएच कॉन्फ़िगरेशन का समर्थन करता है

यदि आपकी ~/.ssh/configफ़ाइल में पहले से ही सभी SSH कनेक्शन पैरामीटर हैं , तो फैब्रिक मूल रूप से इसका समर्थन करेगा, आपको बस इतना करना है:

env.use_ssh_config = True

अपने fabfile की शुरुआत में।


2
बहुत उपयोगी! यदि आप त्रुटियों की तरह चलते हैं IOError: [Errno 2] No such file or directory: ' /path/to/.ssh/key'या Login password for ' root':यह सुनिश्चित करते हैं कि आपके पास कोई व्हाट्सएप नहीं है .ssh/config। यह उदाहरण के User=rootबजाय User = root...
डेनिस

@ डेनिस यह अभी भी 2016 में एक मुद्दा लगता है ..! धन्यवाद!
gabn88

17

के लिए fabric2 fabfile उपयोग निम्नलिखित में:

from fabric import task, Connection

@task
def staging(ctx):
    ctx.name = 'staging'
    ctx.user = 'ubuntu'
    ctx.host = '192.1.1.1'
    ctx.connect_kwargs.key_filename = os.environ['ENV_VAR_POINTS_TO_PRIVATE_KEY_PATH']

@task
def do_something_remote(ctx):
    with Connection(ctx.host, ctx.user, connect_kwargs=ctx.connect_kwargs) as conn:
        conn.sudo('supervisorctl status')

और इसे साथ चलाएं:

fab staging do_something_remote

अद्यतन:
कई होस्ट (एक होस्ट भी करेगा) के लिए आप इसका उपयोग कर सकते हैं:

from fabric2 import task, SerialGroup

@task
def staging(ctx):
    conns = SerialGroup(
        'user@10.0.0.1',
        'user@10.0.0.2',
        connect_kwargs=
        {
            'key_filename': os.environ['PRIVATE_KEY_TO_HOST']
        })
    ctx.CONNS = conns
    ctx.APP_SERVICE_NAME = 'google'

@task
def stop(ctx):
    for conn in ctx.CONNS:
        conn.sudo('supervisorctl stop ' + ctx.APP_SERVICE_NAME)

और इसे फैब या फैब 2 के साथ चलाएं:

fab staging stop

1
यह फैब्रिक 2.x में करने का सही तरीका है, क्योंकि अन्य सभी उत्तर काम नहीं करेंगे।
विवेक आदित्य

इस stagingकार्य में कई मेजबानों का समर्थन कैसे करें ?
ब्लैक_राइडर

1
@ ब्लेक_राइडर, ने इसे मेरे उत्तर में जोड़ दिया
माइकएल

15

मेरे लिए, निम्नलिखित काम नहीं किया:

env.user=["ubuntu"]
env.key_filename=['keyfile.pem']
env.hosts=["xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com"]

या

fab command -i /path/to/key.pem [-H [user@]host[:port]]

हालाँकि, निम्नलिखित ने किया:

env.key_filename=['keyfile.pem']
env.hosts=["ubuntu@xxx-xx-xxx-xxx-southeast-1.compute.amazonaws.com"]

या

env.key_filename=['keyfileq.pem']
env.host_string="ubuntu@xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com"

3
यदि आप env.user="ubuntu"इसके बजाय उपयोग करते हैं तो आपका पहला उदाहरण मेरे लिए काम करता है env.user=["ubuntu"]
टेलर एड्मिस्टन

7

मुझे आज यह करना था, मेरी .py फ़ाइल यथासंभव सरल थी, जैसे @YuvalAdam के उत्तर में पोस्ट की गई थी लेकिन फिर भी मुझे पासवर्ड के लिए संकेत मिलता रहा ...

को देखते हुए paramikoलॉग (के लिए ssh कपड़े द्वारा इस्तेमाल किया पुस्तकालय), मैं लाइन पाया:

असंगत ssh सहकर्मी (कोई स्वीकार्य kex एल्गोरिथ्म नहीं)

मैंने इसके paramikoसाथ अपडेट किया:

sudo pip install paramiko --upgrade

और अब यह काम कर रहा है।


1

जैसा कि ऊपर कहा गया है, फैब्रिक एक फैशन के बाद .ssh / config फाइल सेटिंग्स को सपोर्ट करेगा, लेकिन ec2 के लिए pem फाइल का उपयोग करने में समस्या होने लगती है। IOW एक ठीक से सेटअप। Ssh / config फाइल कमांड लाइन से 'ssh servername' के माध्यम से काम करेगा और जब env.host = ['servername'] पर 'fab someask' के साथ काम करने में विफल रहता है।

यह मेरे fabfile.py में env.key_filename = 'keyfile' को निर्दिष्ट करने और पहले से ही मेरे .shsh / config में IdentityFile प्रविष्टि की नकल करने से दूर हो गया।

यह फैब्रिक या पैरामिको या तो हो सकता है, जो मेरे मामले में फैब्रिक 1.5.3 और पैरामिको 1.9.0 था।


1

इनमें से किसी भी जवाब ने मेरे लिए py3.7, fabric2.5.0 और paramiko 2.7.1 पर काम किया।

हालाँकि, दस्तावेज़ में PKey विशेषता का उपयोग करने से काम होता है: http://docs.fabfile.org/en/2.5/concepts/authentication.html#pStreet-key-objects

from paramiko import RSAKey
ctx.connect_kwargs.pkey = RSAKey.from_private_key_file('path_to_your_aws_key')
with Connection(ctx.host, user, connect_kwargs=ctx.connect_kwargs) as conn:
    //etc.... 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.