Проблемы при попытке SSH в новый экземпляр EC2 с Paramiko - PullRequest
9 голосов
/ 17 мая 2011

Я работаю над сценарием, который запускает новый экземпляр EC2 с помощью boto и использует SSH-клиент Paramiko для выполнения удаленных команд на экземпляре. По какой-то причине клиент Paramiko не может подключиться, я получаю сообщение об ошибке:

Traceback (most recent call last):
  File "scripts/sconfigure.py", line 29, in <module>
    ssh.connect(instance.ip_address, username='ubuntu', key_filename=os.path.expanduser('~/.ssh/test'))
  File "build/bdist.macosx-10.3-fat/egg/paramiko/client.py", line 291, in connect
  File "<string>", line 1, in connect
socket.error: [Errno 61] Connection refused

Я могу ssh в порядке вручную, используя тот же файл ключа и пользователя. Кто-нибудь сталкивался с проблемами, используя Paramiko? Мой полный код ниже. Спасибо.

import boto.ec2, time, paramiko, os
# Connect to the us-west-1 region
ec2 = boto.ec2.regions()[3].connect()
image_id = 'ami-ad7e2ee8'
image_name = 'Ubuntu 10.10 (Maverick Meerkat) 32-bit EBS'
new_reservation = ec2.run_instances(
    image_id=image_id,
    key_name='test',
    security_groups=['web'])

instance = new_reservation.instances[0]

print "Spinning up instance for '%s' - %s. Waiting for it to boot up." % (image_id, image_name)
while instance.state != 'running':
    print "."
    time.sleep(1)
    instance.update()

print "Instance is running, ip: %s" % instance.ip_address

print "Connecting to %s as user %s" % (instance.ip_address, 'ubuntu')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(instance.ip_address, username='ubuntu', key_filename=os.path.expanduser('~/.ssh/test'))
stdin, stdout, stderr = ssh.exec_command('echo "TEST"')
print stdout.readlines()
ssh.close()

Ответы [ 5 ]

10 голосов
/ 17 мая 2011

Кажется, я понял это методом проб и ошибок. Даже если состояние экземпляра «работает» в соответствии с boto, существует задержка, когда он фактически разрешит соединение SSH. Добавление «time.sleep (30)» перед «ssh.connect (...)», кажется, помогает мне, хотя это может варьироваться.

2 голосов
/ 26 апреля 2016

Способ проверить, доступен ли он по ssh, состоит в том, чтобы удостовериться, что две проверки его состояния прошли оба прохода.В веб-интерфейсе это выглядит так: enter image description here

И используя boto3 (первоначальный вопрос использовал boto, но 5 лет назад), мы можем сделать:

2 голосов
/ 12 ноября 2012

Почему бы не использовать boto.manage.cmdshell вместо?

cmd = boto.manage.cmdshell.sshclient_from_instance(instance,
                                                   key_path,
                                                   user_name='ec2_user')

(код взят из строки 152 в ec2_launch_instance.py )

Для доступных команд cmdshell посмотрите класс SSHClient из cmdshell.py .

1 голос
/ 12 июня 2012

Я недавно столкнулся с этой проблемой.«Правильный» способ - сначала запустить close (), а затем снова открыть соединение.Однако в более старых версиях close () была нарушена.

В этой или более поздней версии ее следует исправить: https://github.com/boto/boto/pull/412

«Правильный» метод:

newinstance = image.run(min_count=instancenum, max_count=instancenum, key_name=keypair, security_groups=security_group, user_data=instancename, instance_type=instancetype, placement=zone)
time.sleep(2)
newinstance.instances[0].add_tag('Name',instancename)

print "Waiting for public_dns_name..."
counter = 0
while counter < 70:
    time.sleep(1)
    conn.close()
    conn = boto.ec2.connection.EC2Connection(ec2auth.access_key,ec2auth.private_key)
    startedinstance = conn.get_all_instances(instance_ids=str(newinstance.instances[0].id))[0]
    counter = counter + 1
    if str(startedinstance.instances[0].state) == "running":
        break
    if counter == 69:
        print "Timed out waiting for instance to start."
print "Added: " + startedinstance.instances[0].tags['Name'] + " " + startedinstance.instances[0].public_dns_name
0 голосов
/ 18 мая 2019

Я недавно просматривал этот код, и у меня есть предложение для кода. Вместо запуска цикла while для проверки, работает ли экземпляр, вы можете попробовать "wait_until_running ()".

Ниже приведен примеркод ...

client = boto3.resource(
    'ec2',
    region_name="us-east-1"
)

Instance_ID = "<your Instance_ID>"
instance = client.Instance(Instance_ID)
instance.start()
instance.wait_until_running()

После этого попробуйте ввести код для подключения ssh.

...