GitLab CI: SSH ล้มเหลวไม่สามารถรับรองความถูกต้องของคีย์ส่วนตัว
ฉันไปตามลิงค์นี้เพื่อพยายาม SSH ไปยังเซิร์ฟเวอร์ของฉันใน Gitlab-CI สำหรับคีย์ SSH ฉันเข้าไปในเซิร์ฟเวอร์และสร้างคีย์สาธารณะและคีย์ส่วนตัว คีย์ส่วนตัวถูกแยกออกเป็นตัวแปร env ของ GitLab CI / CD
เทมเพลต YAML มีดังต่อไปนี้ซึ่งส่วนใหญ่คัดลอกมาจากลิงก์
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
อย่างไรก็ตามฉันพบข้อผิดพลาดในการพยายามเข้าถึงคีย์ส่วนตัว
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.
ฉันใช้นักวิ่งที่ใช้ร่วมกันของ gitlab ถ้าช่วยได้
[อัปเดต]
ลืมเพิ่มในเซิร์ฟเวอร์ที่ฉันต้องการเชื่อมต่อฉันได้เพิ่มคีย์สาธารณะที่ฉันสร้างid_rsa.pub
ลงในauthorized_keys
ไฟล์
[แก้ไข 1]
ตามที่แนะนำฉันได้เพิ่มโฮสต์ที่รู้จักโดยใช้ ssh-keyscan เพื่อคัดลอกผลลัพธ์เป็นตัวแปร $ SSH_KNOWN_HOSTS ด้านล่างของไฟล์ yaml ที่อัปเดต อย่างไรก็ตามฉันพบข้อผิดพลาดเดียวกัน
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
คำตอบ
ฉันไม่แน่ใจsshpass
เพราะฉันมักจะใช้คีย์สาธารณะ / ส่วนตัว นี่คือตัวอย่างของงานที่ฉันจะตั้งค่าให้รันSCP
/ SSH
คำสั่งบนเซิร์ฟเวอร์ระยะไกล:
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"
ก่อนดำเนินการไปป์ไลน์คุณต้องทำสิ่งต่อไปนี้:
- สร้างคู่คีย์ ssh โดยใช้
ssh-keygen
. อย่าใช้รหัสผ่าน คีย์สาธารณะลงท้าย.pub
ด้วยคีย์ส่วนตัวไม่มีนามสกุล - SSH ไปยังเซิร์ฟเวอร์ระยะไกลคัดลอกเนื้อหาของคีย์สาธารณะลงในไฟล์
~/.ssh/authorized_keys
- คัดลอกเนื้อหาของคีย์ส่วนตัวของคุณลงในตัวแปรสภาพแวดล้อมไฟล์ GitLab ที่เรียกว่า
SSH_PRIVATE_KEY
- หากคุณใช้
$HOSTNAME
ตัวแปรสภาพแวดล้อมกำหนดตัวแปรในไปป์ไลน์ของคุณและเพิ่ม IP / ชื่อโฮสต์ให้กับ/etc/hosts
ไฟล์ในคอนเทนเนอร์ไปป์ไลน์ของคุณ มิฉะนั้นให้ใช้ที่อยู่ IP แทน