Использование ключевого файла SSH с помощью Fabric

Как настроить тканью для подключения к удаленным узлам с использованием файлов SSH (например, экземпляров Amazon EC2)?

Ответ 1

Также стоит упомянуть здесь, что для этого можно использовать аргументы командной строки:

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

Ответ 2

Поиск простого файла с рабочим примером использования ключевого файла 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 может ее искать при подключении.

Ответ 3

Еще одна интересная функция, доступная с Fabric 1.4 - Теперь Fabric поддерживает конфигурации SSH.

Если у вас уже есть все параметры соединения SSH в вашем файле ~/.ssh/config, Fabric будет его поддерживать, вам нужно добавить:

env.use_ssh_config = True

в начале вашего файла.

Ответ 4

Для меня следующее не работает:

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 [[email protected]]host[:port]]

Однако следующее:

env.key_filename=['keyfile.pem']
env.hosts=["[email protected]"]

или

env.key_filename=['keyfileq.pem']
env.host_string="[email protected]"

Ответ 5

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

и запустить его с FAB или FAB2:

fab staging stop

Ответ 6

Я должен был сделать это сегодня, мой .py файл был как можно более простым, как и тот, который был отправлен в ответ @YuvalAdam, но все же я все время запрашивал пароль...

Посмотрев на журнал paramiko (библиотека, используемая в качестве материала для ssh), я нашел строку:

Несовместимый ssh-сверст (без приемлемого алгоритма kex)

Я обновил paramiko с помощью

sudo pip install paramiko --upgrade

И теперь он работает.

Ответ 7

Как указано выше, Fabric будет поддерживать настройки файла .ssh/config после моды, но использование файла pem для ec2 кажется проблематичным. IOW правильно настроенный файл .ssh/config будет работать из командной строки через 'ssh servername' и не работать с "fab sometask", когда env.host = ['servername'].

Это было преодолено, указав env.key_filename = 'keyfile' в моем файле fabfile.py и дублируя запись IdentityFile уже в моем .ssh/config.

Это может быть либо Fabric, либо paramiko, что в моем случае было Fabric 1.5.3 и Paramiko 1.9.0.