जवाबों:
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
पर्यावरण चर स्थापित कर रहा है, ताकि कनेक्ट करते समय पैरामिको कॉन्फ़िगरेशन इसके लिए देख सके।
settings
संदर्भ प्रबंधक और जब तक मैं बदल यह key_filename पहचान करने के लिए नहीं मिल सका key_filename='/path/to/key'
करने के लिए key_filename=['/path/to/key']
तो किसी और को परेशानी हो रही है, तो उस key_filename कुंजी की एक सूची बनाने इसे ठीक कर सकता है। यह फैब 1.10.1 और Paramiko 1.15.2 के साथ है
फैब्रिक 1.4 के रूप में उपलब्ध एक और शांत सुविधा - फैब्रिक अब एसएसएच कॉन्फ़िगरेशन का समर्थन करता है ।
यदि आपकी ~/.ssh/config
फ़ाइल में पहले से ही सभी SSH कनेक्शन पैरामीटर हैं , तो फैब्रिक मूल रूप से इसका समर्थन करेगा, आपको बस इतना करना है:
env.use_ssh_config = True
अपने fabfile की शुरुआत में।
IOError: [Errno 2] No such file or directory: ' /path/to/.ssh/key'
या Login password for ' root':
यह सुनिश्चित करते हैं कि आपके पास कोई व्हाट्सएप नहीं है .ssh/config
। यह उदाहरण के User=root
बजाय User = root
...
के लिए 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
staging
कार्य में कई मेजबानों का समर्थन कैसे करें ?
मेरे लिए, निम्नलिखित काम नहीं किया:
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"
env.user="ubuntu"
इसके बजाय उपयोग करते हैं तो आपका पहला उदाहरण मेरे लिए काम करता है env.user=["ubuntu"]
।
मुझे आज यह करना था, मेरी .py फ़ाइल यथासंभव सरल थी, जैसे @YuvalAdam के उत्तर में पोस्ट की गई थी लेकिन फिर भी मुझे पासवर्ड के लिए संकेत मिलता रहा ...
को देखते हुए paramiko
लॉग (के लिए ssh कपड़े द्वारा इस्तेमाल किया पुस्तकालय), मैं लाइन पाया:
असंगत ssh सहकर्मी (कोई स्वीकार्य kex एल्गोरिथ्म नहीं)
मैंने इसके paramiko
साथ अपडेट किया:
sudo pip install paramiko --upgrade
और अब यह काम कर रहा है।
जैसा कि ऊपर कहा गया है, फैब्रिक एक फैशन के बाद .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 था।
इनमें से किसी भी जवाब ने मेरे लिए 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....