Bài 3. Vòng Lặp trong Bash DevOps: Tự Động Hóa Lặp Lại Hiệu Quả

Vòng Lặp trong Bash – Tự Động Hóa Lặp Lại trong DevOps

Sau khi biết cách dùng biến (bài 1) và thêm logic với điều kiện (bài 2), giờ là lúc làm cho script Bash của bạn mạnh mẽ hơn với vòng lặp trong Bash DevOps. Vòng lặp giúp bạn tự động hóa những công việc lặp đi lặp lại – như kiểm tra nhiều server, xử lý danh sách file, hay chạy lệnh nhiều lần. Trong bài thứ ba của series Bash Script Chuyên Sâu cho DevOps, tôi sẽ dẫn bạn qua for loop Bash, while loop Bash, và thực hành tự động hóa Bash thực tế. Đây là kinh nghiệm tôi rút ra từ việc quản lý hệ thống, không chỉ là lý thuyết suông đâu nhé!

Vòng Lặp trong Bash Là Gì?

Tự Động Hóa Lặp Lại

Vòng lặp cho phép chạy một khối lệnh nhiều lần dựa trên danh sách hoặc điều kiện:

  • Kiểm tra disk trên 10 server thay vì gõ lệnh từng cái.
  • Xử lý tất cả file log trong thư mục mà không cần viết lại code.

Ví dụ: Thay vì chạy df -h 5 lần cho 5 thư mục, vòng lặp làm điều đó trong 1 script.

Tại Sao Quan Trọng trong DevOps?

  • Tiết kiệm thời gian: Tự động hóa task lặp (VD: cập nhật nhiều server).
  • Scale: Quản lý hệ thống lớn dễ dàng (VD: kiểm tra hàng loạt container).
  • Pipeline: Xử lý batch job trong CI/CD.

Thực tế: Tôi từng dùng vòng lặp để kiểm tra CPU trên 20 server, phát hiện 1 máy bất thường trong 1 phút – thủ công thì mất cả buổi.

Các Loại Vòng Lặp trong Bash

For Loop Bash

Dùng để lặp qua danh sách hoặc phạm vi.

  1. Lặp qua danh sách:

    for ITEM in "apple" "banana" "orange"
    do
       echo "Fruit: $ITEM"
    done
    • Kết quả:
      Fruit: apple
      Fruit: banana
      Fruit: orange
  2. Lặp qua phạm vi số:

    for i in {1..3}
    do
       echo "Số: $i"
    done
  3. Lặp qua output lệnh:

    for FILE in $(ls *.txt)
    do
       echo "File: $FILE"
    done

Tips: {1..3} là cú pháp Bash 4+, nếu dùng Bash cũ, thay bằng seq 1 3.

While Loop Bash

Lặp khi điều kiện đúng.

COUNT=1
while [ $COUNT -le 5 ]
do
    echo "Đếm: $COUNT"
    COUNT=$((COUNT + 1))
done
  • Kết quả: In từ 1 đến 5.

Tips: Dùng $(( )) để tính toán số học.

Until Loop

Lặp cho đến khi điều kiện đúng (ngược với while).

COUNT=1
until [ $COUNT -gt 5 ]
do
    echo "Đếm: $COUNT"
    COUNT=$((COUNT + 1))
done

DevOps: While kiểm tra trạng thái liên tục (VD: đợi service chạy), for xử lý danh sách cố định (VD: list server).

Thực Hành: Script Kiểm Tra Nhiều Server

Script với For Loop

Tạo check_servers.sh để kiểm tra disk trên nhiều server:

#!/bin/bash

# Danh sách server (thay bằng IP thật khi dùng SSH - bài 13)
SERVERS="server1 server2 server3"

for SERVER in $SERVERS
do
    echo "Kiểm tra $SERVER..."
    # Giả lập disk usage (thay bằng SSH thực tế sau)
    DISK=$((RANDOM % 100))  # Số ngẫu nhiên 0-99
    if [ $DISK -gt 80 ]; then
        echo "Cảnh báo: Disk trên $SERVER vượt $DISK% (ngưỡng 80%)"
    else
        echo "Disk trên $SERVER ổn: $DISK%"
    fi
done

Script với While Loop

Tạo wait_service.sh để đợi service chạy:

#!/bin/bash

# Giả lập kiểm tra service (thay bằng lệnh thực tế như 'systemctl')
COUNT=0
MAX_WAIT=10

while [ $COUNT -lt $MAX_WAIT ]
do
    if [ $((RANDOM % 2)) -eq 1 ]; then  # Giả lập service chạy
        echo "Service đã chạy sau $COUNT giây!"
        exit 0
    fi
    echo "Đợi service... ($COUNT/$MAX_WAIT)"
    COUNT=$((COUNT + 1))
    sleep 1
done

echo "Timeout: Service không chạy sau $MAX_WAIT giây"
exit 1

Chạy và Test

  1. For loop:

    chmod +x check_servers.sh
    ./check_servers.sh
    • Kết quả mẫu:
      Kiểm tra server1...
      Disk trên server1 ổn: 45%
      Kiểm tra server2...
      Cảnh báo: Disk trên server2 vượt 92% (ngưỡng 80%)
      Kiểm tra server3...
      Disk trên server3 ổn: 67%
  2. While loop:

    chmod +x wait_service.sh
    ./wait_service.sh
    • Kết quả: Chờ ngẫu nhiên, thoát khi “service chạy” hoặc timeout.

DevOps: check_servers.sh có thể mở rộng với SSH (bài 13), wait_service.sh dùng trong pipeline để đợi DB.

Debug Vòng Lặp

  • Thêm -x:
    bash -x check_servers.sh
  • Kiểm tra biến trong vòng lặp:
    echo "Debug: SERVER=$SERVER, DISK=$DISK"

Thực tế: Tôi từng quên tăng $COUNT trong while, vòng lặp chạy vô tận – -x cứu tôi khỏi debug mò mẫm.

Ứng Dụng trong DevOps

Tự Động Hóa Danh Sách

  • Kiểm tra file log:
    for LOG in /var/log/*.log
    do
      if [ -f "$LOG" ]; then
          echo "Xử lý $LOG..."
      fi
    done

Pipeline CI/CD

  • Đợi job hoàn thành:
    wait_job:
    script:
      - bash wait_service.sh

Case study: Một team dùng for loop để kiểm tra 50 container cùng lúc, phát hiện lỗi trong 2 phút thay vì kiểm thủ công cả giờ.

Kết Luận

Vòng lặp trong Bash DevOps là công cụ mạnh mẽ để tự động hóa Bash với for loop Bashwhile loop Bash. Thực hành với check_servers.shwait_service.sh cho thấy bạn có thể xử lý công việc lặp lại hiệu quả – bước tiến lớn trong tự động hóa. Bài tiếp theo, chúng ta sẽ khám phá Xử Lý File trong Bash – cách đọc, ghi, và quản lý dữ liệu như pro.

Điều hướng chuỗi bài viết<< Bài 2. Điều Kiện trong Bash DevOps: Xử Lý Logic Cơ Bản
>> Bài 4. Xử Lý File trong Bash DevOps: Đọc, Ghi và Quản Lý 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

Có thể bạn quan tâm