উত্তর:
কোনও কারণে এসএসএইচ কীফাইল ব্যবহারের কার্যকর উদাহরণ সহ একটি সাধারণ ফ্যাবফিল সন্ধান করা সহজ নয়। আমি এটি সম্পর্কে একটি ব্লগ পোস্ট লিখেছি ( একটি ম্যাচের টুকরো সহ )।
মূলত, ব্যবহারটি এরকম কিছু হয়:
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 এবং প্যারামিকো 1.15.2
ফ্যাব্রিক 1.4 হিসাবে উপলব্ধ অন্য একটি দুর্দান্ত বৈশিষ্ট্য - ফ্যাব্রিক এখন এসএসএইচ কনফিগারেশন সমর্থন করে ।
আপনার ~/.ssh/configফাইলটিতে যদি ইতিমধ্যে সমস্ত এসএসএইচ সংযোগের প্যারামিটার থাকে তবে ফ্যাব্রিক এটিকে স্থানীয়ভাবে সমর্থন করবে, আপনাকে যা করতে হবে তা হ'ল:
env.use_ssh_config = True
আপনার ফেবিলের শুরুতে।
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 ফাইলটি যথাসম্ভব সহজ ছিল, @ ইউভালআডামের উত্তরে পোস্ট করা ফাইলের মতো তবে এখনও আমি পাসওয়ার্ডের জন্য অনুরোধ জানাতে থাকি ...
এ খুঁজছি paramikoলগ (জন্য SSH ফ্যাব্রিক দ্বারা ব্যবহৃত লাইব্রেরি), আমি লাইনে পাওয়া যায়নি:
বেমানান এসএস পিয়ার (কোনও গ্রহণযোগ্য কেক্স অ্যালগোরিদম নেই)
আমি এর সাথে আপডেট paramikoকরেছি:
sudo pip install paramiko --upgrade
এবং এখন এটি কাজ করে।
উপরে উল্লিখিত হিসাবে, ফ্যাব্রিক একটি ফ্যাশন পরে .ssh / কনফিগারেশন ফাইল সেটিংস সমর্থন করবে, কিন্তু ec2 এর জন্য একটি পেম ফাইল ব্যবহার করা সমস্যাযুক্ত বলে মনে হচ্ছে। IW একটি সঠিকভাবে সেটআপ .ssh / কনফিগারেশন ফাইল কমান্ড লাইন থেকে 'ssh সার্ভারনেম' এর মাধ্যমে কাজ করবে এবং env.host = ['সার্ভারনেম'] এ 'ফাব সামিটাস্ক' নিয়ে কাজ করতে ব্যর্থ হবে।
এটি আমার ফ্যাবফিল.পি-তে env.key_filename = 'keyfile' নির্দিষ্ট করে এবং আমার .ssh / কনফিগারেশনে ইতিমধ্যে IdentityFile এন্ট্রিটি নকল করে কাটিয়ে উঠেছে।
এটি ফ্যাব্রিক বা প্যারামিকো হতে পারে, যা আমার ক্ষেত্রে ফ্যাব্রিক ০.৩.৩ এবং পরামিকো ১.৯.০ ছিল।
এই উত্তরগুলির কোনওোটাই আমার পক্ষে পাই 3.3.7, ফ্যাব্রিক 2.5.0 এবং প্যারামিকো 2.7.1 এ কাজ করে নি।
তবে ডকুমেন্টেশনে PKey অ্যাট্রিবিউট ব্যবহার করে কাজ করে: http://docs.fabfile.org/en/2.5/concepts/authentication.html#private-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....