
Estou tentando usar o Ansible para implantar em um host AWS que não possui um endereço IP público. Consigo acessar o host manualmente por ssh em uma caixa de salto e, nessa caixa, ssh na máquina privada, comomy machine-->bastion-->private server
Não acho que possa usar o suporte nativo do Ansible porque este manual usa funções que são compartilhadas com outras peças. Essas funções dependem de grupos de inventário específicos. Se eu configurar group_vars
, isso irá atrapalhar os manuais para implantá-lo em infra-estruturas não-AWS.
Meu arquivo de configuração ssh é assim:
# Servers in availability zone A
Host 10.0.0.*
ProxyCommand ssh -W %h:%p bastion.example.com
IdentityFile ~/.ssh/key.pem
# Servers in availability zone B
Host 10.0.1.*
ProxyCommand ssh -W %h:%p bastion.example.com
IdentityFile ~/.ssh/key.pem
# The bastion host itself
Host bastion.example.com
User ubuntu
IdentityFile ~/.ssh/key.pem
ControlMaster auto
ControlPath ~/.ssh/ansible-%r@%h:%p
ControlPersist 5m
Observe que a chave é a mesma para os servidores bastião e privados.
Quando tento ssh 10.0.0.175 -F /tmp/aws_bastion_ssh_config -vvv
obtenho a seguinte saída:
(venv) andrew@dell:~/projects/ansible-playbooks$ ssh 10.0.0.175 -F /tmp/aws_bastion_ssh_config -vvv
OpenSSH_7.2p2 Ubuntu-4ubuntu2.4, OpenSSL 1.0.2g 1 Mar 2016
debug1: Reading configuration data /tmp/aws_bastion_ssh_config
debug1: /tmp/aws_bastion_ssh_config line 6: Applying options for 10.0.0.*
debug1: Executing proxy command: exec ssh -W 10.0.0.175:22 bastion.example.com
debug1: permanently_drop_suid: 1000
debug1: key_load_public: No such file or directory
debug1: identity file /home/andrew/.ssh/key.pem type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/andrew/.ssh/key.pem-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.4
Permission denied (publickey).
ssh_exchange_identification: Connection closed by remote host
Como posso fazer isso funcionar?
Preciso que a chave esteja presente na caixa de salto? Como faço para configurar isso?
Editar: Mais informações: - Para esclarecer que posso me conectar à máquina privada a partir da caixa de salto quando chegar ssh bastion.example.com -F /tmp/aws_bastion_ssh_config
ao servidor bastião. Copiei a chave para esse servidor e quando me conectei à máquina privada. Idealmente, eu preferiria não ter a chave na caixa de salto, só a coloquei lá para garantir que a rede esteja funcionando corretamente.ssh [email protected] -i ~/.ssh/key.pem
Responder1
O que você faz com ProxyCommand é iniciar dois comandos ssh totalmente separados.
- que está tentando usar o Proxy para autenticar em 10.0.0.175, então você não precisa das chaves e configuração no bastion.
- aquele que fornece o proxy, que só precisa ser capaz de se autenticar no bastião.
Seu comando para 1. funciona bem, mas você não está vendo a saída de depuração para 2. Como você usou um TLD resolvível e todo o resto é configuração comum, 2. não está exibindo nenhum erro - mas não está fazendo o que deseja porque foi nunca forneceu as opções IdentityFile
e User
da sua configuração. Ele está autenticando com uma chave ou usuário diferente e foi rejeitado pelo bastion (com razão).
Para garantir que 2. também leia sua configuração, passe explicitamente essa opção assim:
# Servers in availability zone A
Host 10.0.0.*
ProxyCommand ssh -vvv -F /tmp/aws_bastion_ssh_config -W %h:%p bastion.example.com
IdentityFile ~/.ssh/key.pem
# Servers in availability zone B
Host 10.0.1.*
ProxyCommand ssh -vvv -F /tmp/aws_bastion_ssh_config -W %h:%p bastion.example.com
IdentityFile ~/.ssh/key.pem
# The bastion host itself
Host bastion.example.com
User ubuntu
IdentityFile ~/.ssh/key.pem
ControlMaster auto
ControlPath ~/.ssh/ansible-%r@%h:%p
ControlPersist 5m
E tudo deve funcionar. Confirme com:
ssh -vvv -F /tmp/aws_bastion_ssh_config 10.0.0.175
Em seguida, remova o -vvv
formulário 1. e 2. Se você mover /tmp/aws_bastion_ssh_config
para o local padrão, ambas -F
as opções poderão ser removidas (e o ssh lerá/etc/ssh/ssh_config
e ~/.ssh/config files
)