Menggunakan keyfile SSH dengan Fabric

100

Bagaimana Anda mengonfigurasi fabric untuk terhubung ke host jarak jauh menggunakan file kunci SSH (misalnya, instans Amazon EC2)?

Yuval Adam
sumber

Jawaban:

69

Juga perlu disebutkan di sini bahwa Anda dapat menggunakan argumen baris perintah untuk ini:

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

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_filenamevariabel lingkungan, sehingga konfigurasi Paramiko dapat mencarinya saat menghubungkan.

Yuval Adam
sumber
4
dalam prakteknya ini adalah jawaban yang lebih baik.
panchicore
3
env.key_filename dapat berisi daftar string untuk mencoba beberapa file kunci untuk koneksi.
Carl G
Saya sedang menyiapkan kunci pemrograman di salah satu tugas saya menggunakan settingsmanajer 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
Jaymon
2
@AseemHegshetye, Ini telah dihapus di Fabric 2. Jawaban ini untuk Fabric 1.
Iulian Onofrei
1
Saya lebih memilih impor eksplisit daripada impor *
mit
64

Fitur keren lainnya tersedia pada Fabric 1.4 - Fabric sekarang mendukung konfigurasi SSH .

Jika Anda sudah memiliki semua parameter koneksi SSH di ~/.ssh/configfile Anda , Fabric akan mendukungnya secara native, yang perlu Anda lakukan hanyalah menambahkan:

env.use_ssh_config = True

di awal fabfile Anda.

Yuval Adam
sumber
2
Sangat berguna! Jika Anda mengalami kesalahan seperti 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=rootalih-alih User = root...
dennis
@dennis Ini sepertinya masih menjadi masalah di tahun 2016 ..! Terima kasih!
gabn88
17

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(
        '[email protected]',
        '[email protected]',
        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
MikeL
sumber
1
Ini adalah cara yang benar untuk dilakukan di fabric 2.x, Karena semua jawaban lainnya tidak akan berfungsi.
Vivek Aditya
Bagaimana cara mendukung banyak host dalam stagingtugas ini ?
Black_Rider
1
@Black_Rider, menambahkannya ke jawaban saya
MikeL
15

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=["[email protected]"]

atau

env.key_filename=['keyfileq.pem']
env.host_string="[email protected]"
Gaurav Toshniwal
sumber
3
Contoh pertama Anda bekerja untuk saya jika Anda menggunakan env.user="ubuntu"bukan env.user=["ubuntu"].
Taylor Edmiston
7

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 paramikolog (perpustakaan yang digunakan oleh fabric untuk ssh), saya menemukan baris:

Peer ssh tidak kompatibel (tidak ada algoritme kex yang dapat diterima)

Saya memperbarui paramikodengan:

sudo pip install paramiko --upgrade

Dan sekarang berhasil.

flagg19
sumber
1

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.

Jeff Doran
sumber
1

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.... 
Keith Entzeroth
sumber