일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- AI
- IntelliJ
- kotlin querydsl
- kotlin coroutine
- 기록으로 실력을 쌓자
- kotlin
- MySQL
- 티스토리챌린지
- 코틀린 코루틴의 정석
- APM
- minikube
- kotlin spring
- Linux
- 정보처리기사 실기
- Java
- 오블완
- Kubernetes
- 정보처리기사 실기 기출문제
- aws
- Spring
- CloudWatch
- mysql 튜닝
- 공부
- Elasticsearch
- PETERICA
- CKA 기출문제
- CKA
- AWS EKS
- Pinpoint
- 정보처리기사실기 기출문제
- Today
- Total
피터의 개발이야기
[Jenkins] pipeline에서 SSH Agent를 이용한 원격서버 관리방법 본문
ㅁ 들어가며
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에서 SSH를 사용해 원격 서버 명령 실행하기: jenkins 사용자 설정 가이드
ㅇ [Jenkins]Springboot프로젝트를 AWS에 배포하기 (Jenkins Pipeline)
'DevOps > Jenkins' 카테고리의 다른 글
[jenkins] Jenkins “Pending – Waiting for Next Executor” 해결방법 (0) | 2024.02.21 |
---|---|
[Jenkins] Docker 기반 Jenkins quick start examples (1) | 2023.10.19 |
[jenkins] jenkins 빌드 후 JAR 파일 복사 (1) | 2023.10.17 |
[Jenkins] jenkins 로컬시간 변경하기 (0) | 2022.10.24 |
[Jenkins] Jenkins 백업 복원 방법 (0) | 2022.10.01 |