2014-01-10 3 views
0

Мой код:SSH в AWS сервера и редактировать файл хостов

По какой-то причине это, кажется, бесконечный цикл и неоднократно печати «» и здесь 2 выход 'Ls -lah. Является ли что-то кровоточащим, я поступаю неправильно?

def update_hosts_file(public_dns,hosts_file_info): 
    for dns in public_dns: 
     print 'here2' 
     ssh = paramiko.SSHClient() 
     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # wont require saying 'yes' to new fingerprint 
     key_path = os.path.join(os.path.expanduser(KEY_DIR), KEY_NAME)+'.pem' 
     ssh.connect(dns,username='ubuntu',key_filename=key_path) 
     ssh.exec_command('touch testing') 
     a,b,c=ssh.exec_command("ls -lah") 
     print b.readlines() 
     a,b,c=ssh.exec_command("file = open('/home/ubuntu/hosts', 'w')") 
     #print b.readlines() 
     ssh.exec_command("file.write('127.0.0.1 localhost\n')") 
     for tag,ip in hosts_file_info.iteritems(): 
      ssh.exec_command("file.write('%s %s\n' % (ip,tag))") 
     ssh.exec_command("file.close()") 
     ssh.close() 

public_dns = 'ec2-xx-xxx-xxx-xxx.compute-1.amazonaws.com' 
print public_dns 
hosts_file_info = {} 
#hosts_file_info['1']='test' 
#hosts_file_info['2']='test2' 
#hosts_file_info['3']='test3' 
#print hosts_file_info 
update_hosts_file(public_dns,hosts_file_info) 
+1

Похоже, вы пытаетесь выполнять операторы Python, как если бы они были Баш команды, как файл ' = open ('/ home/ubuntu/hosts', 'w') '. Я не уверен, что это даст вам синтаксическую ошибку bash, или ошибка из 'file' like' can not open '=' (Нет такого файла) ', но я уверен, что она ничего не принесет. – abarnert

+0

BTW, проверьте Ткань http://docs.fabfile.org/en/1.8/. Это делает этот стиль автоматизации простым и удобным. –

ответ

2

Вашей первая проблема заключается в том public_dns является строкой, поэтому for dns in public_dns: Переберет символы этой строки. Вы попробуете код с 'e', затем с 'c', затем с '2' и так далее. Это не бесконечный цикл, но это петля длиной 42, и я мог легко видеть, как вы скучаете и отменяете ее до того, как закончите.

Если вы хотите только один сервер, вам все равно нужен список строк, это просто, что список будет иметь только одну строку, как это:

public_dns = ['ec2-xx-xxx-xxx-xxx.compute-1.amazonaws.com'] 

Ваша следующая проблема состоит в том, что ваш Код ssh не имеет никакого смысла. Вы пытаетесь выполнить инструкции Python, например file = open('/home/ubuntu/hosts', 'w'), как если бы они были командами bash. В bash эта команда является синтаксической ошибкой, потому что вы не можете использовать круглые скобки таким образом в сценариях оболочки. И если вы исправили это, это было бы просто вызовом команды file, которая жаловалась бы на то, что не сможет найти файл с именем =. Вы можете загрузить скрипт Python на удаленный сервер, а затем запустить его, вставить один через <<HERE или попробовать сценарий интерактивного интерпретатора Python, но вы не можете просто запустить код Python в интерпретаторе bash.

Кроме того, exec_command запускает команду и сразу же возвращает вам каналы stdin/stdout/stderr. Он не ждет завершения команды. Таким образом, вы не можете упорядочить несколько команд, просто делая a,b,c = ssh.exec_command(…) один за другим.


Итак, как вы могли это исправить? Это действительно имеет смысл начинать заново, чем пытаться выяснить, что каждая часть этого должна была сделать и как заставить ее работать.

Насколько я могу судить, на каждой машине вы пытаетесь создать новый файл, содержимое которого основано только на данных, которые у вас есть локально, и одинаковых на всех машинах. Итак, зачем даже пытаться запускать код на каждом удаленном компьютере, который создает этот файл? Просто создайте его локально, один раз и загрузите его на каждый удаленный компьютер, например, с помощью Paramiko's sftp. Что-то вроде этого (очевидно, непроверенных, потому что у меня нет данных, серверные учетные данные и т.д.):

hosts = ['127.0.0.1 localhost\n'] 
for ip, tag in hosts_file_info.iteritems(): 
    hosts.append('%s %s\n' % (ip,tag)) 
for dns in public_dns: 
    ssh = paramiko.SSHClient() 
    # etc. up to connect 
    sftp = paramiko.SFTPClient.from_transport(ssh.get_transport()) 
    f = sftp.open('/home/ubuntu/hosts', 'w') 
    f.writelines(hosts) 
    f.close() 
+0

Спасибо, я не знал, что могу использовать sftp –

2

Вы перебираете каждую букву в переменной public_dns. Вы, наверное, хотите что-то вроде этого:

public_dns = ['ec2-xx-xxx-xxx-xxx.compute-1.amazonaws.com'] 
Смежные вопросы