Bài 13. Tự Động Hóa SSH với Bash DevOps: Quản Lý Multi-Server 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:

  1. Tạo key:
    ssh-keygen -t rsa -b 4096
  2. Copy key sang server:
    ssh-copy-id user@server
  3. 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

  1. Setup SSH key:

    ssh-keygen
    ssh-copy-id user@server1
    ssh-copy-id user@server2
    ssh-copy-id user@server3
  2. 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%

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.

Điều hướng chuỗi bài viết<< 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 14. Bash và Docker trong DevOps: Quản Lý Container Hiệu Quả
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận