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

Bài 3. Vòng Lặp trong Bash-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

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 System/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 nhiều 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

System/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)
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: 60%
      Kiểm tra server2...
      Cảnh báo: Disk trên server2 vượt 95% (ngưỡng 80%)
      Kiểm tra server3...
      Disk trên server3 ổn: 30%
  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.

DevOpscheck_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 là công cụ mạnh mẽ để tự động hóa Bash với for loop Bash và while loop Bash. Thực hành với check_servers.sh và wait_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ả

Leave a Reply

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *