Tự Động Hóa SSH với Bash – Quản Lý Multi-Server trong DevOps
Khi làm DevOps, quản lý một server đã đủ thách thức, nhưng với hàng chục hay hàng trăm server, việc SSH thủ công là ác mộng. Tự Động Hóa SSH với Bash DevOps giúp bạn dùng SSH Bash để quản lý server Bash trên multi-server Bash một cách nhanh chóng và hiệu quả. Trong bài thứ mười ba của series Bash Script Chuyên Sâu cho DevOps, tôi sẽ dẫn bạn qua cách dùng Bash để tự động hóa SSH, kèm thực hành thực tế. Đây là kinh nghiệm tôi áp dụng khi quản lý cụm server, không chỉ là lý thuyết đâu nhé!
Tại Sao Tự Động Hóa SSH với Bash?
SSH trong DevOps
SSH (Secure Shell) là cách kết nối và chạy lệnh trên server từ xa:
- Kiểm tra tài nguyên (CPU, disk).
- Cập nhật phần mềm.
- Thu thập log từ nhiều máy.
Ví dụ: Thay vì SSH từng server để kiểm tra disk, Bash tự động làm điều đó trên 10 máy trong 1 script.
Lợi Ích trong DevOps
- Tiết kiệm thời gian: Chạy lệnh hàng loạt thay vì thủ công.
- Nhất quán: Đảm bảo mọi server được xử lý giống nhau.
- Tự động hóa: Kết hợp với cron hoặc pipeline.
Thực tế: Tôi từng dùng script SSH kiểm tra 20 server cùng lúc, phát hiện 1 máy disk đầy trong 2 phút – thủ công thì mất cả giờ.
Công Cụ Tự Động Hóa SSH trong Bash
SSH Cơ Bản
Chạy lệnh qua SSH:
ssh user@server "df -h /"
SSH Không Mật Khẩu
Dùng key để tránh nhập password:
- Tạo key:
ssh-keygen -t rsa -b 4096 - Copy key sang server:
ssh-copy-id user@server - Test:
ssh user@server "echo OK"
Lặp Qua Nhiều Server
Dùng vòng lặp (bài 3):
for SERVER in server1 server2 server3
do
ssh user@$SERVER "hostname"
done
Thực Hành: Script Kiểm Tra Multi-Server
Script SSH Kiểm Tra
Tạo multi_server_check.sh:
#!/bin/bash
set -e
trap 'echo "Lỗi tại dòng $LINENO: $BASH_COMMAND" >&2; exit 1' ERR
# Biến
SERVERS=("user@server1" "user@server2" "user@server3") # Thay bằng server thật
LOG_FILE="/var/log/multi_server.log"
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
DISK_THRESHOLD=${DISK_THRESHOLD:-80}
# Hàm ghi log
log() {
echo "[$TIMESTAMP] $1" >> "$LOG_FILE" 2>/dev/null || {
echo "Không thể ghi log" >&2
exit 1
}
}
# Hàm kiểm tra server
check_server() {
local SERVER=$1
echo "Kiểm tra $SERVER..."
local DISK=$(ssh "$SERVER" "df -h / | tail -1 | awk '{print \$5}' | cut -d'%' -f1" 2>/dev/null)
if [ -z "$DISK" ]; then
log "Lỗi: Không kết nối được $SERVER"
return 1
fi
if [ "$DISK" -gt "$DISK_THRESHOLD" ]; then
log "Cảnh báo: Disk trên $SERVER vượt $DISK% (ngưỡng $DISK_THRESHOLD%)"
else
log "Disk trên $SERVER ổn: $DISK%"
fi
}
# Lặp qua server
for SERVER in "${SERVERS[@]}"
do
check_server "$SERVER"
done
echo "Kiểm tra hoàn tất, xem log tại $LOG_FILE"
Chuẩn Bị và Chạy
- Setup SSH key:
ssh-keygen ssh-copy-id user@server1 ssh-copy-id user@server2 ssh-copy-id user@server3 - Chạy script:
chmod +x multi_server_check.sh ./multi_server_check.sh- Kết quả mẫu:
Kiểm tra user@server1... Kiểm tra user@server2... Kiểm tra user@server3... Kiểm tra hoàn tất, xem log tại /var/log/multi_server.log - Check log:
[2025-03-13 10:00:00] Disk trên user@server1 ổn: 42% [2025-03-13 10:00:00] Disk trên user@server2 vượt 85% (ngưỡng 80%) [2025-03-13 10:00:00] Disk trên user@server3 ổn: 33%
- Kết quả mẫu:
Giải thích:
"${SERVERS[@]}": Mảng server (bài 3).ssh "$SERVER": Chạy lệnh từ xa.2>/dev/null: Ẩn lỗi SSH để xử lý trong script.
DevOps: Script này giám sát nhiều server, có thể tích hợp cron hoặc pipeline.
Debug SSH
- Test kết nối:
ssh user@server1 "echo OK" || echo "Kết nối fail" - Debug script:
bash -x multi_server_check.sh
Thực tế: Tôi từng quên copy key, SSH treo – thêm kiểm tra $DISK rỗng giúp phát hiện lỗi nhanh.
Ứng Dụng trong DevOps
Quản Lý Multi-Server
- Cập nhật phần mềm:
for SERVER in "${SERVERS[@]}" do ssh "$SERVER" "sudo apt update && sudo apt upgrade -y" done
Pipeline CI/CD
- Kiểm tra server trước deploy:
pre_deploy: script: - bash multi_server_check.sh - grep "Cảnh báo" /var/log/multi_server.log && exit 1
Case study: Một team dùng Bash SSH để thu thập log từ 50 server, phân tích tập trung – giảm 80% thời gian debug.
Best Practice
- Dùng SSH key thay password.
- Kiểm tra kết nối trước khi chạy lệnh.
- Ghi log mọi hành động.
Kết Luận
Tự Động Hóa SSH với Bash DevOps với SSH Bash là cách mạnh mẽ để quản lý server Bash trên multi-server Bash. Thực hành với multi_server_check.sh cho thấy bạn có thể giám sát nhiều server dễ dàng – kỹ năng quan trọng trong DevOps. Bài tiếp theo, chúng ta sẽ khám phá Bash và Docker – cách quản lý container như pro.
