Bagaimana Anda mengonfigurasi fabric untuk terhubung ke host jarak jauh menggunakan file kunci SSH (misalnya, instans Amazon EC2)?
Bagaimana Anda mengonfigurasi fabric untuk terhubung ke host jarak jauh menggunakan file kunci SSH (misalnya, instans Amazon EC2)?
Jawaban:
Menemukan fabfile sederhana dengan contoh kerja penggunaan keyfile SSH tidaklah mudah karena beberapa alasan. Saya menulis posting blog tentang itu ( dengan intisari yang cocok ).
Pada dasarnya, penggunaannya berjalan seperti ini:
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')
Bagian yang penting adalah mengatur env.key_filename
variabel lingkungan, sehingga konfigurasi Paramiko dapat mencarinya saat menghubungkan.
env.key_filename
dapat berisi daftar string untuk mencoba beberapa file kunci untuk koneksi.
settings
manajer konteks dan tidak bisa mendapatkannya untuk mengenali key_filename sampai aku berubah key_filename='/path/to/key'
untuk key_filename=['/path/to/key']
jadi jika ada orang lain yang mengalami kesulitan, membuat key_filename daftar kunci mungkin memperbaikinya. Ini dengan fab 1.10.1 dan Paramiko 1.15.2
Fitur keren lainnya tersedia pada Fabric 1.4 - Fabric sekarang mendukung konfigurasi SSH .
Jika Anda sudah memiliki semua parameter koneksi SSH di ~/.ssh/config
file Anda , Fabric akan mendukungnya secara native, yang perlu Anda lakukan hanyalah menambahkan:
env.use_ssh_config = True
di awal fabfile Anda.
IOError: [Errno 2] No such file or directory: ' /path/to/.ssh/key'
atau Login password for ' root':
pastikan Anda tidak memiliki spasi di file .ssh/config
. Ini sebagai contoh User=root
alih-alih User = root
...
Untuk fabric2 di fabfile gunakan yang berikut ini:
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')
dan jalankan dengan:
fab staging do_something_remote
PEMBARUAN:
Untuk beberapa host (satu host juga akan melakukannya) Anda dapat menggunakan ini:
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)
dan jalankan dengan fab atau fab2:
fab staging stop
staging
tugas ini ?
Bagi saya, hal berikut tidak berhasil:
env.user=["ubuntu"]
env.key_filename=['keyfile.pem']
env.hosts=["xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com"]
atau
fab command -i /path/to/key.pem [-H [user@]host[:port]]
Namun, hal berikut berhasil:
env.key_filename=['keyfile.pem']
env.hosts=["ubuntu@xxx-xx-xxx-xxx-southeast-1.compute.amazonaws.com"]
atau
env.key_filename=['keyfileq.pem']
env.host_string="ubuntu@xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com"
env.user="ubuntu"
bukan env.user=["ubuntu"]
.
Saya harus melakukan ini hari ini, file .py saya sesederhana mungkin, seperti yang diposting dalam jawaban @YuvalAdam tetapi saya tetap diminta memasukkan kata sandi ...
Melihat paramiko
log (perpustakaan yang digunakan oleh fabric untuk ssh), saya menemukan baris:
Peer ssh tidak kompatibel (tidak ada algoritme kex yang dapat diterima)
Saya memperbarui paramiko
dengan:
sudo pip install paramiko --upgrade
Dan sekarang berhasil.
Seperti yang dinyatakan di atas, Fabric akan mendukung pengaturan file .ssh / config setelah mode, tetapi menggunakan file pem untuk ec2 tampaknya menjadi masalah. IOW file .ssh / config yang diset dengan benar akan bekerja dari baris perintah melalui 'ssh servername' dan gagal untuk bekerja dengan 'fab sometask' ketika env.host = ['servername'].
Ini diatasi dengan menentukan env.key_filename = 'keyfile' di fabfile.py saya dan menduplikasi entri IdentityFile yang sudah ada di .ssh / config saya.
Ini bisa berupa Fabric atau paramiko, yang dalam kasus saya adalah Fabric 1.5.3 dan Paramiko 1.9.0.
Tak satu pun dari jawaban ini berhasil untuk saya di py3.7, fabric2.5.0 dan paramiko 2.7.1.
Namun, menggunakan atribut PKey dalam dokumentasi tidak berfungsi: 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....