Como você configura a malha para se conectar a hosts remotos usando arquivos de chave SSH (por exemplo, instâncias do Amazon EC2)?
Como você configura a malha para se conectar a hosts remotos usando arquivos de chave SSH (por exemplo, instâncias do Amazon EC2)?
Respostas:
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_filename
variável de ambiente, para que a configuração do Paramiko possa procurá-la durante a conexão.
env.key_filename
pode conter uma lista de strings para tentar vários arquivos de chave para uma conexão.
settings
gerenciador 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
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/config
arquivo, 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.
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=root
vez de User = root
...
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
staging
tarefa?
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"
env.user="ubuntu"
vez de env.user=["ubuntu"]
.
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 paramiko
log (a biblioteca usada pelo fabric para ssh), encontrei a linha:
Peer ssh incompatível (nenhum algoritmo kex aceitável)
Eu atualizei paramiko
com:
sudo pip install paramiko --upgrade
E agora está funcionando.
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.
Nenhuma dessas respostas funcionou para mim em py3.7, fabric2.5.0 e paramiko 2.7.1.
No entanto, usar o atributo PKey na documentação funciona: http://docs.fabfile.org/en/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....