관리 메뉴

피터의 개발이야기

[Jenkins] pipeline에서 SSH Agent를 이용한 원격서버 관리방법 본문

DevOps/Jenkins

[Jenkins] pipeline에서 SSH Agent를 이용한 원격서버 관리방법

기록하는 백앤드개발자 2025. 2. 3. 21:44
반응형

ㅁ 들어가며

Jenkins에서 원격 서버에 안전하게 접속하여 명령어를 실행하기 위해 SSH Agent를 사용하는 방법을 정리하였다.

사전에 젠킨스를 설치되어 있어야 한다.

 

ㅁ SSH Agent란?

  SSH Agent는 SSH 키를 관리하고, 원격 서버에 대한 인증을 자동화하는 도구이다. Jenkins에서는 SSH Agent 플러그인을 통해 Pipeline에서 SSH 키를 안전하게 사용할 수 있다. 이를 통해 원격 서버에 접속하여 명령어를 실행하거나 파일을 전송하는 등의 작업을 자동화할 수 있다.

 

ㅁ Test를 위한 젠킨스 설치

로컬에서 테스트를 위해 [Jenkins] Docker 기반 Jenkins quick start examples을 참조하여 빠르게 구축하였다.

# git clone
$ git clone https://github.com/ash-sxn/GSoC-2023-docker-based-quickstart.git jenkins-quickstart

# docke 실행
$ docker compose -f docker-compose.yaml up -d

ㅇ 위 명령어를 실행하면 끝.

 

ㅇ localhost:8080에 접속

ㅇ 정보: admin/admin 

 

ㅁ SSH Agent 플러그인 설치

ㅇ Jenkins 관리 > 플러그인 관리에서 "SSH Agent" 플러그인을 설치

 

ㅁ SSH Keygen 이해

[Linux] SSH Keygen: 안전한 원격 접속을 위한 키 생성 도구에서 SSH keygen 사용법을 따로 정리하였다.

SSH Keygen로 생성된 SSH key로 암호 대신 인증하여 비밀번호 입력없이 원격 접속할 수 있게 한다.

Jenkins 서버와 원격 서버가 비밀번호 없이 통신하기 위해 SSH키를 생성 해야 한다.

 

ㅁ SSH키 생성

 먼저, 원격 서버에 접속하기 위한 SSH 키를 생성해야 한다. 아래 명령어를 통해 SSH 키를 생성한다.

# SSH 디렉토리가 없으면 생성하여 이동
mkdir ~/.ssh && chmod 700 ~/.ssh

 

sudo -u jenkins ssh-keygen -t rsa \
  -b 4096 \
  -C "jenkins@your-server"\
  -f ~/.ssh/id_rsa

ㅇ Jenkins 서버에서 원격서버의 사용자@주소를 기준으로 SSH키를 생성한다.

ㅇ 이 명령어를 실행하면 ~/.ssh/id_rsa(개인 키)와 ~/.ssh/id_rsa.pub(공개 키) 파일이 생성된다.

 

# 복사
scp ~/.ssh/id_rsa.pub user@remote_server:~

# 공개키 등록
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

ㅇ 공개 키는 원격 서버의 ~/.ssh/authorized_keys 파일에 추가해야 한다.

ㅇ 공개키를 원격 서버로 전송하여 원격 서버에서 공개키 등록한다.

 

ㅁ Jenkins에 SSH 인증 정보 등록

ㅇ Jenkins 관리 > Credentials > System > Global credentials (unrestricted)로 이동하여 "Add Credentials"를 클릭한다.

 

ㅇ Kind: SSH Username with private key
ㅇ Scope: Global
ㅇ ID: 원하는 ID (예: peterica-server-key)
ㅇ Username: 원격 서버의 사용자 이름 (예: ubuntu)
ㅇ Private Key: Enter directly를 선택하고, 생성한 개인 키(~/.ssh/id_rsa)의 내용을 붙여넣는다.

 

ㅁ Jenkins Pipeline에서 SSH Agent 사용하기

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                // SSH Agent를 사용하여 원격 서버에 접속
                sshagent(credentials: ['peterica-server-key']) {
                    // 원격 서버에서 명령어 실행
                    sh """
                        ssh -o StrictHostKeyChecking=no peterseo@192.168.33.24 '
                            echo Hello, World!
                        '
                    """
                }
            }
        }
        
        // 여러 명령어를 실행
        stage('Execute Multiple Commands') {
            steps {
                sshagent(credentials: ['peterica-server-key']) {
                    sh """
                        ssh -o StrictHostKeyChecking=no peterseo@192.168.33.24 '
                            echo "Hello, World!"
                            echo "peterica!!"
                        '
                    """
                }
            }
        }
    }
}

 

ㅇ StrictHostKeyChecking=no 옵션을 사용하여 호스트 키 확인을 비활성화할 수 있다.

 

ㅁ 파일 전송하기

원격 서버로 파일을 전송하려면 scp 명령어를 사용할 수 있다.

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                // SSH Agent를 사용하여 원격 서버에 접속
                sshagent(credentials: ['peterica-server-key']) {
                    // 원격 서버에서 명령어 실행
                    sh """
                        date > ./test.txt
                        scp -o StrictHostKeyChecking=no ./test.txt peterseo@192.168.33.24:~/. 
                    """
                }
            }
        }
    }
}

 

ㅁ 여러 서버에 배포하기

여러 서버에 동시에 배포해야 하는 경우, parallel 구문을 사용해 병렬로 처리할 수 있다.

pipeline {
    agent any

    stages {
        stage('Deploy') {
            steps {
                script {
                    def servers = ['192.168.33.24', '192.168.33.24', '192.168.33.24']

                    parallel servers.collectEntries { server ->
                        ["Deploy to ${server}": {
                            sshagent(credentials: ['peterica-server-key']) {
                                sh "ssh -o StrictHostKeyChecking=no peterseo@${server} 'echo Deploying to ${server}'"
                            }
                        }]
                    }
                }
            }
        }
    }
}

 

ㅁ 마무리

  Jenkins Pipeline에서 SSH Agent를 사용하면 원격 서버 관리 작업을 자동화할 수 있다. 이를 통해 배포 프로세스를 더 효율적으로 관리하고, 인간의 실수를 줄일 수 있다. 

 

 

ㅁ 함께 보면 좋은 사이트

Jenkins - SSH Pipeline Steps

 Jenkins plugin - SSH Agent

 Jenkins에서 SSH를 사용해 원격 서버 명령 실행하기: jenkins 사용자 설정 가이드

[Jenkins]Springboot프로젝트를 AWS에 배포하기 (Jenkins Pipeline)

 

 

반응형
Comments