Как узнать, готово ли соединение python fabri c? - PullRequest
0 голосов
/ 25 марта 2020

У меня есть скрипт, который создает AWS экземпляров и использует fabric == 2.5.0 для их настройки. Вот моя проблема с использованием экземпляра Fabric2 Connection в сценарии:

def setup_site(self, ip, name):
    connection = Connection(ip, user='toolman')
    # If I put ipdb here, just continuing it will work.
    # If take the debug line out, it will fail
    # with "NoValidConnectionsError: [Errno None] Unable to connect to port 22 on ..."
    # import ipdb; ipdb.set_trace()
    connection.put(self.create_setup_file(name), 'setup.yaml')

Я могу просто нажать 'c', чтобы продолжить отладчик, и все работает каждый раз. Если у меня нет строки отладчика, вызов connection.put завершается ошибкой каждый раз с «NoValidConnectionsError: [Errno None] Невозможно подключиться к порту 22 на ...».

AWS экземпляр, в который он помещает файл, работает (instance.wait_until_running () возвращается в коде, вызывающем setup_site).

1 Ответ

0 голосов
/ 25 марта 2020

Если я сплю python в течение 30 с, все работает, так что эта проблема, вероятно, что-то не готово в экземпляре AWS.

connection.open() не требуется, но иногда работает, потому что это требует времени.

В итоге я использовал следующую функцию вместо вызова Connection:

def ensure_connection(*connection_args, ensure_connection_timeout=30, **connection_kwargs):
    start = timer()
    while (timer() - start) < ensure_connection_timeout:
        try:
            connection = Connection(*connection_args, **connection_kwargs)
            connection.open()
            return connection
        except NoValidConnectionsError as e:
            connection_error = e
    # noinspection PyUnboundLocalVariable
    raise connection_error
...