Fabric ile bir SSH anahtar dosyası kullanma


99

Yapıyı SSH anahtar dosyaları (örneğin, Amazon EC2 bulut sunucuları) kullanarak uzak ana bilgisayarlara bağlanacak şekilde nasıl yapılandırırsınız?

Yanıtlar:


68

Ayrıca burada bunun için komut satırı değiştirgelerini kullanabileceğinizi belirtmeye değer:

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

151

Çalışan bir SSH anahtar dosyası kullanım örneğiyle basit bir fabfile bulmak bazı nedenlerden dolayı kolay değildir. Bununla ilgili bir blog yazısı yazdım ( eşleşen bir özetle ).

Temel olarak, kullanım şuna benzer:

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

Önemli kısım, env.key_filenameortam değişkenini ayarlamaktır , böylece Paramiko konfigürasyonu bağlanırken onu arayabilir.


4
pratikte bu daha iyi cevaptır.
panchicore

3
env.key_filename bir bağlantı için birden çok anahtar dosyası denemek için bir dizi listesi içerebilir .
Carl G

Ben kullanarak benim görevlerden birinde programlı anahtarı batıyordu settingsbağlam yöneticisi ve değiştim kadar key_filename tanımak için alınamadı key_filename='/path/to/key'için key_filename=['/path/to/key']öylesine başkasının bu belayı düzeltmek olabilir key_filename anahtarların bir listesini yapıyor eğer. Bu fab 1.10.1 ve Paramiko 1.15.2 ile
Jaymon

2
@AseemHegshetye, En son Kumaş 2'de kaldırıldı. Bu cevap Kumaş 1 için.
Iulian Onofrei

1
İthalat yerine açık ithalatı tercih ederim *
mit

64

Fabric 1.4'ten itibaren sunulan başka bir harika özellik - Fabric artık SSH yapılandırmalarını destekliyor .

~/.ssh/configDosyanızda tüm SSH bağlantı parametrelerine zaten sahipseniz , Fabric bunu yerel olarak destekleyecektir, yapmanız gereken tek şey eklemek:

env.use_ssh_config = True

fabfile dosyanızın başında.


2
Çok kullanışlı! Gibi hatalarla karşılaşırsanız IOError: [Errno 2] No such file or directory: ' /path/to/.ssh/key'veya Login password for ' root':yalnızca .ssh/config. Örneğin, User=rootyerine User = root...
dennis

@dennis 2016'da da bu hala sorun olmaya devam ediyor ..! Teşekkürler!
gabn88

17

İçin fabric2 fabfile kullanımda şu içinde:

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

ve şununla çalıştırın:

fab staging do_something_remote

GÜNCELLEME:
Birden çok ana bilgisayar için (bir ana bilgisayar da yapacaktır) bunu kullanabilirsiniz:

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)

ve fab veya fab2 ile çalıştırın:

fab staging stop

1
Kumaş 2.x'te yapmanın doğru yolu budur, çünkü diğer tüm cevaplar işe yaramayacaktır.
Vivek Aditya

Bu staginggörevde birden çok ana bilgisayar nasıl desteklenir ?
Black_Rider

1
@Black_Rider, cevabıma ekledi
MikeL

15

Benim için aşağıdakiler işe yaramadı:

env.user=["ubuntu"]
env.key_filename=['keyfile.pem']
env.hosts=["xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com"]

veya

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

Ancak aşağıdakiler yapıldı:

env.key_filename=['keyfile.pem']
env.hosts=["ubuntu@xxx-xx-xxx-xxx-southeast-1.compute.amazonaws.com"]

veya

env.key_filename=['keyfileq.pem']
env.host_string="ubuntu@xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com"

3
Onun env.user="ubuntu"yerine kullanırsanız ilk örneğiniz benim için işe yarar env.user=["ubuntu"].
Taylor Edmiston

7

Bunu bugün yapmak zorundaydım, .py dosyam olabildiğince basitti, @ YuvalAdam'ın cevabındaki gibi, ama yine de bir şifre girmem isteniyor ...

paramiko(Fabric tarafından ssh için kullanılan kitaplık) günlüğüne baktığımda şu satırı buldum:

Uyumsuz ssh eşi (kabul edilebilir kex algoritması yok)

Şununla güncelledim paramiko:

sudo pip install paramiko --upgrade

Ve şimdi çalışıyor.


1

Yukarıda belirtildiği gibi, Fabric bir modadan sonra .ssh / config dosyası ayarlarını destekleyecektir, ancak ec2 için bir pem dosyası kullanmak sorunlu görünmektedir. IOW düzgün bir kurulum .ssh / config dosyası 'ssh sunucuadı' aracılığıyla komut satırından çalışacak ve env.host = ['sunucuadı'] olduğunda 'fab sometask' ile çalışmayacaktır.

Bu, fabfile.py dosyamda env.key_filename = 'keyfile' belirtilerek ve zaten .ssh / config dosyamda bulunan IdentityFile girişini çoğaltarak aşıldı.

Bu, Fabric veya paramiko olabilir, benim durumumda Fabric 1.5.3 ve Paramiko 1.9.0 idi.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.