Використання SSH-файлу ключів з Fabric


100

Як налаштувати тканину для підключення до віддалених хостів за допомогою ключів SSH (наприклад, примірники Amazon EC2)?

Відповіді:


69

Тут також варто зазначити, що для цього можна використовувати аргументи командного рядка:

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

150

Пошук простого файлу файлів з робочим прикладом використання файлів SSH-ключів чомусь непростий. Я написав про це повідомлення в блозі ( з відповідним суть ).

В основному, використання виглядає приблизно так:

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змінної середовища, щоб конфігурація Paramiko могла шукати її під час підключення.


4
на практиці це краща відповідь.
panchicore

3
env.key_filename може містити список рядків для спробу декількох ключових файлів для з'єднання.
Карл Г

Я налаштовував ключ програмно в одній із моїх задач за допомогою settingsдиспетчера контексту, і не міг змусити його розпізнавати ім'я_файла, доки я не змінився, key_filename='/path/to/key'щоб у key_filename=['/path/to/key']когось іншого виникли проблеми, перетворення ключового імені переліку ключів може його виправити. Це з fab 1.10.1 та Paramiko 1.15.2
Jaymon

2
@AseemHegshetye, її видалено в останній статті 2. Ця відповідь призначена для Fabric 1.
Iulian Onofrei

1
Я віддаю перевагу явного імпорту замість імпорту *
міт

64

Ще одна цікава функція, доступна як у Fabric 1.4 - Fabric тепер підтримує конфігурації SSH .

Якщо у вас вже є всі параметри з'єднання SSH у вашому ~/.ssh/configфайлі, Fabric буде його підтримувати, все, що вам потрібно зробити, це додати:

env.use_ssh_config = True

на початку вашого файлового файлу.


2
Дуже корисний! Якщо у вас виникли помилки на кшталт IOError: [Errno 2] No such file or directory: ' /path/to/.ssh/key'або Login password for ' root':просто переконайтеся, що у вас немає пробілів .ssh/config. Це, наприклад, User=rootзамість User = root...
dennis

@dennis Це все ще видається проблемою у 2016 році ..! Дякую!
gabn88

17

Для 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)

і запустіть його за допомогою fab або fab2:

fab staging stop

1
Це правильний спосіб зробити в тканині 2.x, оскільки всі інші відповіді не спрацюють.
Vivek Aditya

Як підтримати кілька хостів у цьому stagingзавданні?
Black_Rider

1
@Black_Rider, додав це до моєї відповіді
MikeL

15

Для мене наступне не спрацювало:

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"

3
Ваш перший приклад працює для мене, якщо ви використовуєте env.user="ubuntu"замість цього env.user=["ubuntu"].
Тейлор Едмістон

7

Мені довелося це зробити сьогодні, мій файл .py був максимально простим, як той, який розміщено у відповіді @YuvalAdam, але я все одно отримував запит на пароль ...

Переглядаючи paramikoжурнал (бібліотека, яка використовується тканиною для ssh), я знайшов рядок:

Несумісний ssh ​​peer (немає прийнятного кекс-алгоритму)

Я оновив paramiko:

sudo pip install paramiko --upgrade

А зараз це працює.


1

Як було сказано вище, Fabric буде підтримувати .ssh / config файли після модифікації, але використовувати pem-файл для ec2 видається проблематичним. IOW правильно встановлений .ssh / config файл буде працювати з командного рядка через 'ssh ім'я сервера' і не працюватиме з 'fab sometask', коли env.host = ['ім'я сервера'].

Це було подолано, вказавши env.key_filename = 'keyfile' у моєму fabfile.py та дублюючи запис IdentityFile, що вже є в моєму .ssh / config.

Це може бути або Fabric, або paramiko, який у моєму випадку був Fabric 1.5.3 та Paramiko 1.9.0.


1

Жодна з цих відповідей не працювала для мене на py3.7, fabric2.5.0 та paramiko 2.7.1.

Однак використання атрибута PKey в документації працює: http://docs.fabfile.org/uk/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.... 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.