У меня относительно стандартная установка AWS, которая выглядит так:
[ App server ] \
[ App server ] -- [ Dev gateway ]
[ App server ] /
Где серверы доступны только через 22 с IP шлюза, а шлюз открыт для всего мира.
Доступ к шлюзу контролируется открытым ключом, и любой, чей открытый ключ находится у пользователя шлюза (одно и то же имя пользователя для серверов и шлюза), может войти по ssh без пароля.
Наконец, у пользователя шлюза есть серверы .pem
файл как его .ssh/id_rsa
, поэтому любой пользователь на шлюзе может подключиться по ssh напрямую ssh [private ip address]
.
Тем не менее: я хотел бы использовать Fabric, запускаемый локально на машине разработчика, чтобы открыть соединение с заданным сервером приложений (в конечном итоге, чтобы запустить оболочку Django). Но я не могу даже установить соединение, не говоря уже о запуске оболочки. Вот что у меня есть:
env.user = 'user_name'
...
@task
def remote_shell():
run('echo on gateway')
env.gateway = 'dev_gateway'
env.host_string = 'app_server_internal_ip'
env.key_filename = '~/.ssh/id_rsa'
env.use_ssh_config = True
run('echo hello')
Это уже кажется мне излишним, просто вставляя туда все директивы, которые я могу придумать, но независимо от того, какую комбинацию вышеперечисленных опций я выберу, я получаю тот же результат:
[dev_gateway] Executing task 'remote_shell'
[dev_gateway] run: echo on gateway
[dev_gateway] out: on gateway
[dev_gateway] out:
[app_server_internal_ip] run: echo hello
[app_server_internal_ip] Passphrase for private key:
[app_server_internal_ip] Login password for 'user_name':
Итак, очевидно, что что-то не выстраивается, поскольку пользователь может подключиться по ssh как к шлюзу, так и к серверу приложений, даже не вводя кодовую фразу или пароль. Что я делаю не так?