Menggunakan keyfile SSH dengan Fabric


100

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

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]]

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.


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.


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(
        '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

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=["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"

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.


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.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.