2011-05-17 17 views
8

ile çözmeye çalışıyor Sorunlar boto ile yeni bir EC2 örneğini döndüren ve örnekte uzak komutları yürütmek için Paramiko SSH istemcisini kullanan bir komut dosyası üzerinde çalışıyorum. Sebebi ne olursa olsun, Paramiko istemci bağlamak için unabled, ben hata alıyorum:SSM'ye yeni bir EC2 örneğini 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 

ben iyi elle aynı anahtar dosyası ve kullanıcıyı kullanarak ssh olabilir. Paramiko kullanarak sorun yaşayan var mı? Benim tam kodum aşağıda. Teşekkürler.

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() 
+0

+1 iyi bir soru! EC2 hesabımda hiç bir şey yapmadım, bu bana biraz ivme kazandıracak. –

+1

Bağlantı noktasını ssh.connect() 'de 2. parametre olarak belirtmeyi denediniz mi? –

+1

Öneriniz için teşekkürler ama var. Yine de anladım galiba. Durumun durumu boto'ya göre "çalışıyor" olsa bile, herhangi bir SSH bağlantısını gerçekten kabul edeceği zaman için bir gecikme var gibi görünüyor. Bağlantı kurmayı denemeden önce bir time.slep (25) eklemek yeterli görünüyor, ancak daha fazla test yapacağım. –

cevap

10

Bunu deneme yanılma ile çözdüm. Durumun durumu boto'ya göre "çalışıyor" olsa bile, bir SSH bağlantısına ne zaman izin verileceği için bir gecikme vardır. "Ssh.connect (...)" den önce bir "time.sleep (30)" eklemek benim için hile yapar gibi görünüyor, ancak bu değişiklik gösterebilir.

+2

Muhtemelen 'koşma', görüntünün kendisinin önyükleme yaptığı anlamına gelir? Yani işletim sisteminin başlamasını beklemek zorundasınız ve başlamak için sshd. –

+0

Yea, bu en mantıklı. –

+0

Sizinle aynı şeyi yapıyorum (45 saniye ile: p) ve bunu yapmaktan hoşlanmamamın tek yolu bir uyku (x) – Genschi

1

Son zamanlarda bu soruna girdim. "Doğru" yol öncelikle bir kapatma() başlatmak ve ardından bağlantıyı yeniden açmak olacaktır. Ancak daha eski sürümlerde, close() bozuldu.

bu sürümü ile

ya da geç, sabit olmalıdır: https://github.com/boto/boto/pull/412

"Doğru" yöntemi:

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

Neden her zaman döngü boyunca yeni bir bağlantı oluşturduğunuzu anlamıyorum. Bu kod (https://github.com/garnaat/paws/blob/master/ec2_launch_instance.py), her seferinde aynı bağlantıyı kullanan benzer bir döngü yapar. Bu modelle hiç bir problemim olmadı. – garnaat

+0

Sorun şu ki, ilk bağlantı önbelleğe alınır. Bu nedenle, bağlantıyı kapatıp yeniden açmadığınız sürece bir güncelleme için tekrar kontrol etmeyecektir. Yine de testlerimde bulduğum şey bu. Bu konuda boto adamlarla konuşmadım. –

2

Neden yerine boto.manage.cmdshell kullanılır?

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

(ec2_launch_instance.py hattı 152 alınan kodu) mevcut cmdshell komutlar için

cmdshell.py den SSHClient sınıf bir göz.

1

Ssh özelliğini denetlemenin yolu, iki durum denetiminin her ikisinin de geçtiğinden emin olmaktır. web arayüzünden bu şuna benzer: enter image description here

Ve kullanılarak boto3 (orijinal soru kullanılan boto ancak 5 yıl önce), yapabileceğimiz:

session = boto3.Session(...) 
client = session.client('ec2') 
res = client.run_instances(...) # launch instance 
instance_id = res['Instances'][0]['InstanceId'] 

while True: 
    statuses = client.describe_instance_status(InstanceIds=[instance_id]) 
    status = statuses['InstanceStatuses'][0] 
    if status['InstanceStatus']['Status'] == 'ok' \ 
      and status['SystemStatus']['Status'] == 'ok': 
     break 
    print '.' 
    time.sleep(5) 
print "Instance is running, you are ready to ssh to it" 
+0

Bu, denedim. Bir not: Bu durumların her ikisi de 'başlatılıyor'dan' tamam'a geçiş yapmadan önce düğümlere ssh edebilirsiniz. Yani eğer kodunuz sabırsız ve mümkün olduğu kadar çabuk ssh istiyorsa, farklı bir teknik daha iyi olabilir. – t1m0

İlgili konular