
안녕하세요.
서버를 여러 대 운영하다 보면 "같은 명령어를 모든 서버에 동시에 실행하고 싶다"는 순간이 옵니다.
ssh 연결, 작업, 종료 이 작업을 반복하는 건 노가다 + 시간 낭비 입니다.
그래서 오늘은 tmux + Bash 스크립트로 한 번에 해결하는 방법을 정리했습니다.
시작하기 전에 (중요)
모든 서버에 SSH 접속이 가능해야 합니다
즉, 각 서버에 SSH 서버가 실행 중이어야 하고, 네트워크로 접근 가능해야 하며 키 인증이 되어 있어야 합니다
tmux란?
GitHub - tmux/tmux: tmux source code
tmux source code. Contribute to tmux/tmux development by creating an account on GitHub.
github.com
- tmux는 쉽게 말해서 "터미널을 여러 개로 나눠서 동시에 작업"할 수 있게 해주는 툴 입니다
- 여러 서버를 한 화면에서 관리 가능
- 세션 유지 (SSH 끊겨도 복구 가능)
- 입력을 여러 창에 동시에 전달 가능
목표
- 여러 개의 서버에 동시에 접속
- 명령어를 한 번만 입력
- 모든 서버에서 동시에 실행
1. 여러 서버 동시에 접속
move_some_files.bash
SESSION="multi" # "multi" 대신 다른 이름 사용 가능
USER="root"
IPS=(
1.1.1.1
1.1.1.2
1.1.1.3
1.1.1.4
1.1.1.5
1.1.1.6
1.1.1.7
1.1.1.8
1.1.1.9
1.1.1.10
1.1.1.11
1.1.1.12
.
.
.
)
# 같은 이름의 세션이 존재하면 제거
# 2>/dev/null (세션이 없을 때 발생하는 에러를 무시)
tmux kill-session -t $SESSION 2>/dev/null
# "multi"라는 이름의 빈 세션이 백그라운드에서 생성됨
# -d: detach 모드 실행 (백그라운드에서 세션 생성)
# -s: 세션 이름 지정
tmux new-session -d -s $SESSION
# send-keys: $SESSION 세션에 키 입력 전송
# C-m: Carriage Return (Enter 키)
tmux send-keys -t $SESSION "ssh $USER@${IPS[0]}" C-m
# i=1부터 시작: 첫 번째 서버는 이미 pane으로 존재하므로 건너뜀
for ((i=1; i<${#IPS[@]}; i++))
do
# $SESSION이 첫 번째 윈도우(0)를 분할
# 각 분할은 새로운 pane이 됨
tmux split-window -t $SESSION:0
# $SESSION을 "tiled" 레이아웃으로 배치
# tiled는 모든 pane을 동일 크기로 정렬
tmux select-layout -t $SESSION tiled
# 새로운 pane에서 SSH 접속
tmux send-keys -t $SESSION "ssh $USER@${IPS[$i]}" C-m
done
# 최종 화면 정렬
tmux select-layout -t $SESSION tiled
# 모든 pane에 입력 동기화 활성화
tmux setw -t $SESSION synchronize-panes on
# tmux 세션에 접속 (포그라운드로 전환: 사용자 입력이 가능하게 함)
tmux attach -t $SESSION
2. 파일 배포 자동화
connect.bash
USER="user"
PASS="password"
FILE="something.tar.gz"
REMOTE_DIR="/home/tim"
INSTALL_DIR="/home/tim/install"
IPS=(...)
for IP in "$(IPS[@]}"
do
# sshpass -p $PASS ssh ...: 자동 로그인용, 키 입력 없이 자동 실행, 대샹 서버 작업에 필수
sshpass -p $PASS ssh -o StrictHostKeyChecking=no $USER@$IP \
"mkdir -p $INSTALL_DIR"
# scp 파일 전송
sshpass -p $PASS scp -o StrictHostKeyChecking=no $FILE $USER@$IP:$REMOTE_DIR/
sshpass -p $PASS ssh -o StrictHostKeyChecking=no $USER@$IP "
cd $REMOTE_DIR &&
tar -xzf $FILE &&
cp -r target $INSTALL_DIR/
"
done
3. 명령어 실행
./move_some_files.bash
./connect.bash
이렇게 하면 간단하게 위 사진처럼 20개의 터미널을 한 번에 띄워서 파일 전송과 명령어 실행을 동시에 처리할 수 있습니다.
처음에는 번거롭게 느껴질 수 있지만, 한 번 세팅해두면 이후 작업 속도가 확연히 달라집니다.
감사합니다.
댓글