Usando um arquivo de chave SSH com Fabric


100

Como você configura a malha para se conectar a hosts remotos usando arquivos de chave SSH (por exemplo, instâncias do Amazon EC2)?

Respostas:


69

Também vale a pena mencionar aqui que você pode usar os argumentos da linha de comando para isso:

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

150

Encontrar um fabfile simples com um exemplo funcional de uso de keyfile SSH não é fácil por algum motivo. Eu escrevi um post no blog sobre isso ( com uma essência correspondente ).

Basicamente, o uso é mais ou menos assim:

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

O importante é definir a env.key_filenamevariável de ambiente, para que a configuração do Paramiko possa procurá-la durante a conexão.


4
na prática, esta é a melhor resposta.
panchicore

3
env.key_filename pode conter uma lista de strings para tentar vários arquivos de chave para uma conexão.
Carl G,

Eu estava definindo a chave programaticamente em uma de minhas tarefas usando o settingsgerenciador de contexto e não consegui fazer com que ele reconhecesse o key_filename até que mudei key_filename='/path/to/key'para key_filename=['/path/to/key']então se alguém mais estiver tendo problemas, fazer key_filename uma lista de chaves pode corrigir isso. Isto é com fab 1.10.1 e Paramiko 1.15.2
Jaymon

2
@AseemHegshetye, foi removido no último Fabric 2. Esta resposta é para o Fabric 1.
Iulian Onofrei

1
Eu prefiro importações explícitas ao invés de importação *
mit

64

Outro recurso interessante disponível a partir do Fabric 1.4 - o Fabric agora oferece suporte a configurações SSH .

Se você já tem todos os parâmetros de conexão SSH em seu ~/.ssh/configarquivo, o Fabric terá suporte nativo para isso, tudo o que você precisa fazer é adicionar:

env.use_ssh_config = True

no início do seu fabfile.


2
Muito útil! Se você encontrar erros como IOError: [Errno 2] No such file or directory: ' /path/to/.ssh/key'ou Login password for ' root':apenas certifique-se de que não há espaços em branco em seu .ssh/config. É, por exemplo, em User=rootvez de User = root...
dennis

@dennis Isso ainda parece ser um problema em 2016 ..! Obrigado!
gabn88

17

Para fabric2 em fabfile, use o seguinte:

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

e execute-o com:

fab staging do_something_remote

ATUALIZAÇÃO:
para vários hosts (um host também servirá), você pode usar isto:

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)

e execute-o com fab ou fab2:

fab staging stop

1
Essa é a maneira certa de fazer no fabric 2.x, já que todas as outras respostas não funcionarão.
Vivek Aditya de

Como oferecer suporte a vários hosts nesta stagingtarefa?
Black_Rider

1
@Black_Rider, adicionou-o à minha resposta
MikeL

15

Para mim, o seguinte não funcionou:

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

ou

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

No entanto, o seguinte fez:

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

ou

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

3
Seu primeiro exemplo funciona para mim se você usar em env.user="ubuntu"vez de env.user=["ubuntu"].
Taylor Edmiston

7

Tive que fazer isso hoje, meu arquivo .py era o mais simples possível, como o postado na resposta de @YuvalAdam, mas continuava recebendo uma solicitação de senha ...

Olhando para o paramikolog (a biblioteca usada pelo fabric para ssh), encontrei a linha:

Peer ssh incompatível (nenhum algoritmo kex aceitável)

Eu atualizei paramikocom:

sudo pip install paramiko --upgrade

E agora está funcionando.


1

Como afirmado acima, o Fabric suportará configurações de arquivo .ssh / config de uma maneira, mas usar um arquivo pem para ec2 parece ser problemático. IOW um arquivo .ssh / config configurado corretamente funcionará a partir da linha de comando via 'ssh servername' e não funcionará com 'fab sometask' quando env.host = ['servername'].

Isso foi superado especificando env.key_filename = 'keyfile' em meu fabfile.py e duplicando a entrada IdentityFile já em meu .ssh / config.

Pode ser Fabric ou paramiko, que no meu caso era Fabric 1.5.3 e Paramiko 1.9.0.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.