ใช้ ssh ไปยัง linux server ที่ต้องการใน Gitlab-ci

สำหรับใครที่ต้องการ ssh ไปยัง linux server ที่ต้องการเพื่อ deploy ระบบ โดยให้มันทำ automation ทั้งหมดผ่าน Gitlab-ci มาดูกันว่ายังไง

สร้าง Private key ที่เครื่อง server

ไปยัง server ที่ต้องการ deploy ระบบ แล้วทำการสร้าง private key ขึ้นมา 1 ชุด

$ ssh-keygen -t ed25519
$ cd .ssh/
$ cat id_ed25519.pub >> authorized_keys
$ ls .ssh/

จากนั้นเราจะได้ไฟล์ id_ed25519 และ id_ed25519.pub

Encode ให้เป็น base64

ให้ทำการ copy id_ed25519 ออกมาเป็นไฟล์ใหม่ก่อน

$ cp id_ed25519 id_ed25519_base64

ทำการแก้ไขไฟล์ id_ed25519_base64 โดยเราจะทำการเพิ่ม 1 บรรทัดว่าง ๆ ต่อจาก private key ในบรรทัดท้ายสุด เช่น

-----BEGIN OPENSSH PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END OPENSSH PRIVATE KEY-----
 

อ้างอิง: https://github.com/openssl/openssl/discussions/21481#discussioncomment-8343177

จากให้เรา encode id_ed25519_base64 ให้เป็น base64

$ cat id_ed25519_base64 | base64 -w 0

มันได้จะ string ยาว ๆ มา 1 ชุด เช่น LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnphQz ทำการเก็บไว้ก่อน

ลบ id_ed25519_base64 ได้เลย ไม่ได้ใช้แล้ว

$ rm id_ed25519_base64

เพิ่ม variable ใน gitlab

ไปที่ project ของเราใน gitlab จากนั้นไปเมนู Settings > CICD ด้านขวาเลือก Variables แล้วกดปุ่ม Add variable แล้วกำหนดค่าดังนี้

  • Visibility เป็น Masked
  • Protect variable ติ้กถูก
  • Key ใส่ชื่อลงไปเช่น DEPLOY_SSH_KEY
  • Value ใส่ key base64 ที่ทำมา LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnphQz

ทำการ Protected branches

ไปเมนู Settings > Repositories ด้านขวามือเลือก Protected branches แล้วกด Add protected branch

แล้วทำการเลือก branch ที่ต้องการสั่งให้ pipeline ทำงาน เช่น dev และในส่วนของ Allowed to merge และ Allowed to push and merge เป็นการกำหนดให้ Role ไหนทำอะไรได้ ก็เลือกตามสะดวก

กำหนด ssh_deploy job ใน gitlab-ci.yaml

ไปยัง gitlab-ci.yaml ของ project แล้วสร้าง job ตามนี้

variables:
  SSH_URL: "user@xxx.xxx.xxx.xx"

ssh_deploy:
  stage: deploy
  image: alpine
  dependencies: []
  before_script:
    - "command -v ssh-agent >/dev/null || ( apk add --update openssh )"
    - mkdir -p ~/.ssh
    - eval $(ssh-agent -s)
    - echo "$DEPLOY_SSH_KEY" | base64 -d > ./key.file
    - chmod 400 ./key.file
    - ssh-add ./key.file
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
  script:
    - $SSH_URL "ls"
    - $SSH_URL "deploy command"
  only:
    - dev

ในส่วนของ SSH_URL ก็ไปแก้ไขเอาตาม server นั้น ๆ และส่วนของ deploy command ก็ใส่ command อะไรก็ได้ที่เราจะสั่งให้มัน deploy

แค่นี้ละครับ ลองเอาไปปรับแต่งกันต่อเอง...