2024年7月1日月曜日

Gitlab CI を使って特定のサーバに ssh ログインしてコマンドを実行する方法

Gitlab CI を使って特定のサーバに ssh ログインしてコマンドを実行する方法

概要

Gitlab CI を使って対象のサーバに ssh してデプロイスクリプトなどを実行することができるようになります

環境

  • Ubuntu 22.04
  • Gitlab 16.10.6

ssh サーバの設定

基本的にはパスワードなどは聞かれないように事前に設定しておく必要があります

git credentials

  • git config --global credential.helper store

これで認証情報を保存しておいて毎回パスワードを聞かれないようにしましょう
認証情報は CI から投入しても OK です

docker

  • sudo gpasswd -a user01 docker

デフォルトだとユーザは docker グループに入っていないので sudo 権限が必要です
sudo のパスワードなしを設定しても OK です

ノンパスSSH鍵の作成と登録

Runner から対象のサーバに ssh ログインする際にパスワードを入力することができません
なのでパスワードが設定されていない秘密鍵と公開鍵を使ってログインできるようにします

なお以下で紹介しますが SSH するユーザターゲットホストは 192.168.100.10 とします

  • ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa

ここで作成した id_rsa (秘密鍵) を Gitlab の CI の変数として登録します
登録する際の注意としては Protected な変数として登録しないようにしましょう

id_rsa.pub は SSH する対象のサーバ (192.168.100.10) の ~/.ssh/authorized_keys に記載します

CI の設定

Runner の executor は docker を想定しています

以下の例ではリポジトリで管理してる shell/deploy.sh をターゲットホストの /tmp/deploy.sh に配置して実行しています

またターゲットホスト上のシェルに変数を与えたい場合は一度 export してから渡すと ssh 先のマシンにも伝わります

stages:
  - deploy

variables:
  ENV: $ENV
  SSH_PRIVATE_KEY: $SSH_PRIVATE_KEY

deploy:
  stage: deploy
  image: python:alpine3.19
  before_script:
    - 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )'
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
  script:
    - scp -P 22 "${CI_PROJECT_DIR}/shell/deploy.sh" user01@192.168.100.10:/tmp/deploy.sh
    - ssh -p 22 -tt user01@192.168.100.10 -C "chmod +x /tmp/deploy.sh"
    - export ENV=${ENV}
    - ssh -p 22 -tt user01@192.168.100.10 -C "ENV=${ENV} /tmp/deploy.sh"
  when: manual

最後に

Gitlab CI で ssh する方法を紹介しました
パスワードなどの入力が必要な場合は入力させないような対応が必要です

参考サイト

0 件のコメント:

コメントを投稿