上次我們教到完了怎麼在 Gitlab CI/CD 怎麼自動打包 Docker Image 並自動上傳到 Docker Hub 以及如何將 Docker Image 做版號,今天我們來教 Gitlab CI/CD 其中之一很重要的是自動 ssh 連線,因為往後我們會透過 Gitlab 伺服器使用 ssh 連線到另一台主機進行佈署操作
首先我們先檢查是否有 ssh 遠端連線工具,輸入以下指令,如果有出現路徑代表原本就有安裝好
which ssh
|_ /usr/bin/ssh
如果沒有安裝 ssh 這工具,輸入以下指令安裝
sudo apt-get update
sudo apt-get install openssh-server
為什麼需要產生公鑰與私鑰,那是因為第一方面是為了安全,第二方面是通常如果你在第一次 ssh 連線時會問一句話,詢問確定要不要連線那一台伺服器,為了不想再當我們使用 gitlab-runner 連線時,因為那句話出錯。接下來我們使用以下指令生成 ssh 公鑰與私鑰
ssh-keygen -t rsa -C "[email]"
建立好之後,輸入以下指令,進入到存放公鑰與私鑰路徑
cd ~/.ssh/
再輸入以下指令可以看到有兩份文件,id_rsa 也就是我們的私鑰,id_rsa.pub 也就是我們的公鑰
ls
|_ id_rsa id_rsa.pub
ssh-keygen 是可產生公鑰與私鑰工具
-t 意思代表鑰用什麼類型加密
-C 意思代表注釋
接下來我們複製我們的公鑰的內容,到目標連線伺服器,在我們的目標伺服器,輸入以下指令
cd ~/.ssh/
ls
|_ authorized_keys
這時你會發現裡面有份檔名叫 authorized_keys,將公鑰內容貼近這份檔案裡面
接下來我們來設定新的四個變數,為了不讓我們曝露敏感訊息
SERVER_PRIVATE_KEY: 是我們 ssh 私鑰
SERVER_PUBLIC_KEY: 是我們 ssh 公鑰
SERVER_URL: 是我們目標鑰連線機器
SERVER_USER_NAME: 是我們目標使用者名稱
接下來我們開始撰寫 CI/CD 腳本,由 gitlab-runner 自動連線我們目標主機
image: mcr.microsoft.com/dotnet/sdk:6.0
stages:
- deploy
deploy-to-development:
stage: deploy
tags:
- shell
before_script:
- eval $(ssh-agent -s)
- ssh-add <(echo "$SERVER_PRIVATE_KEY")
script:
- ssh -o StrictHostKeyChecking=no $SERVER_USER_NAME@$SERVER_URL "ls -al"
接下來將 CI/CD 腳本上傳 Gitlab,可以看到我們使用 ssh 連線成功
不知道大家記不記得,當你第一次使用 ssh 連線到某台機器的時候,都會先跳出一個訊息,要你確定要不要連線那台機器,要你打 yes/no,不過我們在 CI/CD 這樣做的話會錯,所以我們必須 ssh 後面加上 -o StrictHostKeyChecking=no 這個指令,這樣才不會錯