Bài 7. Quản Lý Biến và Môi Trường trong Bash DevOps

Quản Lý Biến trong Bash DevOps: Biến Môi Trường và Scope Hiệu Quả

Biến là “xương sống” của mọi script Bash, nhưng nếu không quản lý tốt, chúng có thể gây混乱 – từ xung đột giá trị đến lỗi không mong muốn trong pipeline. Trong bài thứ bảy của series Bash Script Chuyên Sâu cho DevOps, tôi sẽ dẫn bạn qua cách quản lý biến trong Bash DevOps, từ biến môi trường Bash, cách dùng export Bash, đến kiểm soát scope biến Bash. Đây là những bài học tôi rút ra từ thực tế khi làm việc với CI/CD và hệ thống, không chỉ là lý thuyết đâu nhé!

Biến và Môi Trường trong Bash Là Gì?

Biến Cơ Bản

Biến lưu giá trị để dùng lại (bài 1):

NAME="DevOps"
echo "$NAME"

Biến Môi Trường

Biến môi trường là biến được hệ thống hoặc shell chia sẻ, ảnh hưởng đến hành vi lệnh/script.

  • Ví dụ mặc định: $USER, $PATH, $HOME.
  • Kiểm tra:
    echo "User: $USER"
    env  # Liệt kê tất cả biến môi trường

DevOps: Biến môi trường rất quan trọng trong pipeline (VD: $CI_COMMIT_SHA trong GitLab).

Tại Sao Quản Lý Biến Quan Trọng?

  • Tính nhất quán: Đảm bảo script chạy đúng trên nhiều môi trường.
  • Bảo mật: Tránh lộ secret (VD: API key).
  • Hiệu quả: Dùng lại biến thay vì hardcode.

Thực tế: Tôi từng quên export biến, script chạy local thì ổn nhưng fail trong CI – từ đó luôn cẩn thận hơn.

Cách Quản Lý Biến trong Bash

Scope Biến Bash

  1. Local: Chỉ dùng trong hàm/script hiện tại.

    my_function() {
       local MY_VAR="Local"
       echo "$MY_VAR"
    }
    my_function
    echo "$MY_VAR"  # Rỗng
  2. Global: Dùng trong toàn shell nếu không khai báo local.

    MY_VAR="Global"
    my_function() {
       echo "$MY_VAR"
    }
    my_function  # In "Global"

Tips: Luôn dùng local trong hàm để tránh xung đột.

Export Bash

Export biến để chia sẻ với subprocess/script khác:

MY_VAR="DevOps"
export MY_VAR
bash -c 'echo $MY_VAR'  # In "DevOps"
  • Không export:
    MY_VAR="DevOps"
    bash -c 'echo $MY_VAR'  # Rỗng

Biến Môi Trường từ File

  1. Dùng source:

    • Tạo config.env:
      DB_HOST="localhost"
      DB_PORT=5432
    • Load:
      source ./config.env
      echo "$DB_HOST:$DB_PORT"
  2. Dùng trong pipeline:

    variables:
     DB_HOST: "localhost"
    script:
     - echo "$DB_HOST"

Thực Hành: Script Dùng Biến trong DevOps

Script Kiểm Tra với Biến Môi Trường

Tạo env_check.sh:

#!/bin/bash

# Biến global
LOG_DIR="/var/log/myapp"
export LOG_DIR

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

# Hàm ghi log
log_status() {
    local MESSAGE="$1"
    if [ -d "$LOG_DIR" ]; then
        echo "$(date): $MESSAGE" >> "$LOG_DIR/status.log"
    else
        echo "Lỗi: $LOG_DIR không tồn tại" >&2
        exit 1
    fi
}

# Gọi hàm
check_disk "/"
log_status "Kiểm tra disk hoàn tất"

# Dùng biến môi trường từ pipeline (nếu có)
if [ -n "$CI_JOB_ID" ]; then
    echo "Chạy trong CI, job ID: $CI_JOB_ID"
fi

Chạy và Test

  1. Local:

    chmod +x env_check.sh
    ./env_check.sh
    • Kết quả mẫu:
      Disk / ổn: 42%
      Lỗi: /var/log/myapp không tồn tại
  2. Với ngưỡng tùy chỉnh:

    DISK_THRESHOLD=50 ./env_check.sh
    • Kết quả: Ngưỡng thay đổi thành 50%.
  3. Mô phỏng CI:

    CI_JOB_ID=123 ./env_check.sh
    • Thêm dòng: “Chạy trong CI, job ID: 123”.

Giải thích:

  • local DISK: Giới hạn scope trong hàm.
  • ${DISK_THRESHOLD:-80}: Dùng 80 nếu biến không được set.
  • export LOG_DIR: Chia sẻ với subprocess (nếu có).

DevOps: Script này có thể dùng trong pipeline để kiểm tra disk và ghi log.

Debug Biến

  • Kiểm tra biến:
    echo "Debug: DISK_THRESHOLD=${DISK_THRESHOLD:-80}"
  • Xem tất cả biến:
    set | grep DISK

Thực tế: Tôi từng nhầm biến global, debug với set giúp tìm ra biến bị ghi đè.

Ứng Dụng trong DevOps

Pipeline CI/CD

  • Dùng biến môi trường:
    variables:
    DISK_THRESHOLD: "70"
    script:
    - bash env_check.sh

Quản Lý Hệ Thống

  • Script dùng biến config:
    source /etc/myapp.conf
    check_disk "$APP_DIR"

Case study: Một team export biến $DEPLOY_ENV trong CI, script tự điều chỉnh hành vi cho dev/prod – giảm lỗi config 80%.

Best Practice

  • Dùng local trong hàm.
  • Export chỉ khi cần cho subprocess.
  • Lưu secret trong file .env, không hardcode.

Kết Luận

Quản lý biến trong Bash DevOps với biến môi trường Bash, export Bash, và scope biến Bash là kỹ năng quan trọng để script linh hoạt và an toàn. Thực hành với env_check.sh cho thấy bạn có thể kiểm soát biến hiệu quả trong hệ thống và pipeline. Bài tiếp theo, chúng ta sẽ khám phá Cron Job trong Bash – cách tự động hóa theo lịch như pro.

Điều hướng chuỗi bài viết<< Bài 6. Function trong Bash DevOps: Tái Sử Dụng Code Hiệu Quả
>> Bài 8. Cron Job trong Bash DevOps: Tự Động Hóa Theo Lịch 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