Danh sách bài viết trong series Bashscript từ cơ bản đến áp dụng vào DevOps
- Bài 1. Cơ Bản Bash Script trong DevOps
- Bài 2. Điều Kiện trong Bash DevOps: Xử Lý Logic Cơ Bản
- Bài 3. Vòng Lặp trong Bash DevOps: Tự Động Hóa Lặp Lại Hiệu Quả
- Bài 4. Xử Lý File trong Bash DevOps: Đọc, Ghi và Quản Lý Hiệu Quả
- Bài 5. Text Processing trong Bash DevOps: Grep, Awk, Sed Hiệu Quả
- Bài 6. Function trong Bash DevOps: Tái Sử Dụng Code Hiệu Quả
- Bài 7. Quản Lý Biến và Môi Trường trong Bash DevOps
- Bài 8. Cron Job trong Bash DevOps: Tự Động Hóa Theo Lịch Hiệu Quả
- Bài 9. Debug trong Bash DevOps: Tìm và Sửa Lỗi Hiệu Quả
- Bài 10. Error Handling Bash DevOps: Xử Lý Ngoại Lệ Hiệu Quả
- Bài 11. Bash trong CI/CD DevOps: Tích Hợp Pipeline Hiệu Quả
- Bài 12. Quản Lý Hệ Thống với Bash DevOps: Theo Dõi và Can Thiệp Hiệu Quả
- Bài 13. Tự Động Hóa SSH với Bash DevOps: Quản Lý Multi-Server Hiệu Quả
- Bài 14. Bash và Docker trong DevOps: Quản Lý Container Hiệu Quả
- Bài 15. Monitoring với Bash DevOps: Báo Cáo Hệ Thống Hiệu Quả
- Bài 16. Bash Nâng Cao: Parallel Execution trong DevOps Hiệu Quả
- Bài 17. Bash và API trong DevOps: Gọi và Xử Lý API Hiệu Quả
- Bài 18. Bash và Cloud CLI trong DevOps: Quản Lý Cloud Hiệu Quả
- Bài 19. Bash và Security trong DevOps: Bảo Mật Script Hiệu Quả
- Bài 20. Best Practice trong Bash DevOps: Làm Chủ Script Hiệu Quả
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.