Bài 6. Function trong Bash DevOps: Tái Sử Dụng Code Hiệu Quả

Function trong Bash – Tái Sử Dụng Code trong DevOps

Khi script Bash của bạn bắt đầu dài ra – lặp lại code, khó bảo trì – đã đến lúc dùng function trong Bash DevOps. Hàm Bash giúp bạn tái sử dụng Bash, biến script thành script modular Bash, dễ đọc và quản lý hơn. Trong bài thứ sáu của series Bash Script Chuyên Sâu cho DevOps, tôi sẽ dẫn bạn qua cách viết và dùng function, kèm thực hành thực tế. Đây là cách tôi tổ chức script khi làm việc với hệ thống và pipeline, không chỉ là lý thuyết đâu nhé!

Function trong Bash Là Gì?

Hàm: Tái Sử Dụng Code

Function (hàm) là khối code bạn định nghĩa một lần, gọi lại nhiều lần – giống hàm trong ngôn ngữ lập trình khác.

  • Không function: Lặp lại lệnh kiểm tra disk 5 lần trong script.
  • Có function: Viết hàm kiểm tra disk, gọi khi cần.

Ví dụ: Thay vì copy-paste lệnh df -h cho mỗi thư mục, bạn viết hàm check_disk và gọi nó.

Tại Sao Quan Trọng trong DevOps?

  • Tái sử dụng: Dùng lại code cho nhiều server, task.
  • Dễ bảo trì: Sửa 1 chỗ thay vì 10 chỗ.
  • Modular: Chia script thành module nhỏ, dễ đọc.

Thực tế: Tôi từng viết hàm kiểm tra CPU, tái dùng trong 3 script khác nhau – tiết kiệm cả giờ debug khi cần sửa.

Cách Dùng Function trong Bash

Định Nghĩa và Gọi Hàm

  1. Cú pháp cơ bản:

    function_name() {
       echo "Đây là hàm"
    }
    • Gọi: function_name.
  2. Ví dụ đơn giản:

    greet() {
       echo "Hello DevOps!"
    }
    greet
    greet
    • Kết quả:
      Hello DevOps!
      Hello DevOps!

Truyền Tham Số

Hàm nhận tham số qua $1, $2, v.v.

greet() {
    echo "Hello, $1!"
}
greet "Alice"
greet "Bob"
  • Kết quả:
    Hello, Alice!
    Hello, Bob!

Return Giá Trị

Bash không có return như ngôn ngữ khác, dùng echo và lấy output.

add() {
    echo $(( $1 + $2 ))
}
SUM=$(add 3 5)
echo "Tổng: $SUM"
  • Kết quả: “Tổng: 8”.

Tips: Dùng $() để gán output hàm vào biến.

Thực Hành: Script Kiểm Tra Hệ Thống với Function

Script Modular

Tạo system_check.sh:

#!/bin/bash

# Hàm kiểm tra disk
check_disk() {
    local DISK=$(df -h "$1" | tail -1 | awk '{print $5}' | cut -d'%' -f1)
    if [ $DISK -gt 80 ]; then
        echo "Cảnh báo: Disk $1 vượt $DISK% (ngưỡng 80%)"
    else
        echo "Disk $1 ổn: $DISK%"
    fi
}

# Hàm kiểm tra CPU
check_cpu() {
    local CPU=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')
    if [ $(echo "$CPU > $1" | bc) -eq 1 ]; then
        echo "Cảnh báo: CPU vượt $CPU% (ngưỡng $1%)"
    else
        echo "CPU ổn: $CPU%"
    fi
}

# Hàm ghi log
log_result() {
    local TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
    echo "[$TIMESTAMP] $1" >> "system_log.txt"
}

# Gọi hàm
check_disk "/"
check_cpu 90
log_result "Kiểm tra hoàn tất trên $(hostname)"

Chạy và Test

chmod +x system_check.sh
./system_check.sh
  • Kết quả mẫu:
    Disk / ổn: 42%
    CPU ổn: 15.3%
  • Check file system_log.txt:
    [2025-03-13 10:00:00] Kiểm tra hoàn tất trên my-server

Giải thích:

  • check_disk: Nhận tham số đường dẫn (VD: /).
  • check_cpu: Nhận ngưỡng CPU làm tham số.
  • log_result: Ghi kết quả vào file (bài 4).
  • local: Giới hạn biến trong hàm, tránh xung đột.

DevOps: Script này có thể mở rộng để kiểm tra nhiều server hoặc tích hợp pipeline.

Debug Function

  • Thêm debug trong hàm:
    check_disk() {
      echo "Debug: Checking $1" >&2
      local DISK=$(df -h "$1" | tail -1 | awk '{print $5}' | cut -d'%' -f1)
      echo "Debug: DISK=$DISK" >&2
      # ...
    }
  • Chạy với -x:
    bash -x system_check.sh

Thực tế: Tôi từng quên local, biến bị ghi đè – debug với echo giúp phát hiện nhanh.

Ứng Dụng trong DevOps

Tái Sử Dụng trong Script

  • Script kiểm tra nhiều thư mục:
    for DIR in "/" "/var" "/tmp"
    do
      check_disk "$DIR"
    done

Pipeline CI/CD

  • Hàm kiểm tra điều kiện:
    check_resources:
    script:
      - |
        check_cpu() {
          CPU=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')
          if [ $(echo "$CPU > 90" | bc) -eq 1 ]; then
            echo "CPU cao, thoát!" >&2
            exit 1
          fi
        }
        check_cpu

Case study: Một team viết hàm check_service, tái dùng trong 5 script giám sát – giảm 50% thời gian bảo trì.

Modular Hóa

  • Lưu hàm vào file riêng (functions.sh):
    # functions.sh
    check_disk() {
      local DISK=$(df -h "$1" | tail -1 | awk '{print $5}' | cut -d'%' -f1)
      echo "$DISK"
    }
  • Import:
    source ./functions.sh
    check_disk "/"

Kết Luận

Function trong Bash DevOps là bước tiến để tái sử dụng Bash và xây dựng script modular Bash. Thực hành với system_check.sh cho thấy bạn có thể tổ chức code gọn gàng, dễ mở rộng – rất cần trong tự động hóa DevOps. Bài tiếp theo, chúng ta sẽ khám phá Quản Lý Biến và Môi Trường – cách kiểm soát biến như pro.

Điều hướng chuỗi bài viết<< Bài 5. Text Processing trong Bash DevOps: Grep, Awk, Sed Hiệu Quả
>> Bài 7. Quản Lý Biến và Môi Trường trong Bash DevOps
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