цикл в случае неудачи - PullRequest
       2

цикл в случае неудачи

0 голосов
/ 03 января 2012

У меня есть следующий код, который пытается подключиться к различным хостам и переместить данные. Проблема в том, что если одна попытка подключения не удалась, код умирает. Как я могу заставить его перейти к следующему узлу в массиве.

h=%w"host1 host2 host3 host4"

h.each do |hostname|

  tn = Net::Telnet::new("Host" => "#{hostname}",
                               "Timeout" => false,
                               "Prompt" => /[$%#>] \z/n)

  tn.cmd('String' =>'user' , 'Match'=>/Password:/) { |c| puts c }
  tn.cmd('String' =>'password', 'Match'=>/#/) { |c| puts c }


      tn.cmd('String' =>"show run | redirect tftp://192.1.1.1/#{hostname}-#{tdate}.cfg", 'Match'=>/#/) { |c| puts c }
      sleep(3)


end

1 Ответ

1 голос
/ 03 января 2012

Вы можете продолжить работу после первой неудачной попытки подключения, обработав исключение, вызванное Net::Telnet::initialize. Вы обнаружите, что не получаете ошибку, которую, по вашему мнению, получаете:

begin
  tn = Net::Telnet::new("Host" => "#{hostname}",
                        "Timeout" => false,
                        "Prompt" => /[$%#>] \z/n)
rescue => e
  puts "Unable to connect to #{hostname}: #{e.message}"
  next
end

Производит

Невозможно подключиться к узлу host1: getaddrinfo: nodename или servname предоставлены или неизвестны

То есть вы на самом деле не предоставляете имя хоста. Аргумент не называется "Host", он называется "host", и регистр имеет значение. Параметры Ruby также обычно передаются в виде символов , а не строк . Попробуйте это:

  tn = Net::Telnet::new(:host    => "#{hostname}",
                        :timeout => false,
                        :prompt  => /[$%#>] \z/n)

Теперь вы получите ожидаемую ошибку:

Невозможно подключиться к хосту1: соединение отказано - подключиться (2)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...