GitLab CI: falha de SSH, não é possível autenticar a chave privada
Segui este link para tentar fazer o SSH para meu servidor no Gitlab-CI. Para as chaves SSH, entrei no servidor e gerei as chaves públicas e privadas. A chave privada é extraída para as variáveis env do GitLab CI / CD.
O modelo YAML é como abaixo, copiado principalmente do link.
image: docker:19.03.8
services:
- docker:19.03.8-dind
deployment:
variables:
ip: <ip-address>
script:
- apk add --update openssh-client sshpass
- eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | ssh-add - > /dev/null
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- export SSHPASS=$AWS_PASSWORD - sshpass -e ssh -o StrictHostKeyChecking=no -vvv ubuntu@$ip echo testing
No entanto, encontrei um erro ao tentar acessar a chave privada.
debug1: Authentications that can continue: publickey,password
debug1: Trying private key: /root/.ssh/id_rsa
debug3: no such identity: /root/.ssh/id_rsa: No such file or directory
debug1: Trying private key: /root/.ssh/id_dsa
debug3: no such identity: /root/.ssh/id_dsa: No such file or directory
debug1: Trying private key: /root/.ssh/id_ecdsa
debug3: no such identity: /root/.ssh/id_ecdsa: No such file or directory
debug1: Trying private key: /root/.ssh/id_ed25519
debug3: no such identity: /root/.ssh/id_ed25519: No such file or directory
debug1: Trying private key: /root/.ssh/id_xmss
debug3: no such identity: /root/.ssh/id_xmss: No such file or directory
debug2: we did not send a packet, disable method
debug3: authmethod_lookup password
debug3: remaining preferred: ,password
debug3: authmethod_is_enabled password
debug1: Next authentication method: password
debug3: send packet: type 50
debug2: we sent a password packet, wait for reply
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,password
Permission denied, please try again.
Estou usando runners compartilhados do gitlab, se isso ajudar.
[Atualizar]
Esqueci de adicionar isso no servidor que desejo conectar, adicionei as chaves públicas que gerei id_rsa.pub
nos authorized_keys
arquivos.
[Editar 1]
Como sugerido, adicionei os hosts conhecidos usando ssh-keyscan para copiar a saída como uma variável $ SSH_KNOWN_HOSTS. Abaixo do arquivo yaml atualizado. No entanto, encontrei o mesmo erro.
deployment:
variables:
ip: <ip-address>
script:
- apk add --update openssh-client sshpass
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | ssh-add - > /dev/null - mkdir -p ~/.ssh - chmod 700 ~/.ssh - touch ~/.ssh/known_hosts - echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- export SSHPASS=$AWS_PASSWORD - sshpass -e ssh -o StrictHostKeyChecking=no -vvv ubuntu@$ip echo testing
Respostas
Não tenho certeza sshpass
, já que geralmente uso chaves públicas / privadas. Aqui está um exemplo de um trabalho que eu configuraria para executar SCP
/ SSH
comandos em servidores remotos:
deploy:
stage: deploy
variables:
hostname: app-dev
before_script:
# optional step if you decide to use a hostname instead of IP address
- cp -f ./network/etc/hosts /etc/hosts
# Setup SSH
- which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )
- eval $(ssh-agent -s) - ssh-add <(cat $SSH_PRIVATE_KEY)
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan $HOSTNAME >> ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts script: # Copy files and execute commands - scp ./scripts/install_package.sh root@$HOSTNAME:/tmp/deploy
- ssh root@$HOSTNAME "/tmp/deploy/install_package.sh && exit"
Antes de executar o pipeline, você precisa fazer o seguinte:
- Gere pares de chaves ssh usando
ssh-keygen
. Não use uma senha longa. A chave pública termina em.pub
, a chave privada não tem extensão. - SSH no servidor remoto, copie o conteúdo da chave pública em
~/.ssh/authorized_keys
- Copie o conteúdo de sua chave privada em um arquivo GitLab. Variáveis de ambiente chamadas
SSH_PRIVATE_KEY
- Se você usar uma
$HOSTNAME
variável de ambiente, defina a variável no pipeline e adicione o IP / nome do host ao/etc/hosts
arquivo no contêiner do pipeline. Caso contrário, use apenas um endereço IP.