Danh sách bài viết trong series Bashscript từ cơ bản đến áp dụng vào DevOps
- Bài 1. Cơ Bản Bash Script trong DevOps
- Bài 2. Điều Kiện trong Bash DevOps: Xử Lý Logic Cơ Bản
- Bài 3. Vòng Lặp trong Bash DevOps: Tự Động Hóa Lặp Lại Hiệu Quả
- Bài 4. Xử Lý File trong Bash DevOps: Đọc, Ghi và Quản Lý Hiệu Quả
- Bài 5. Text Processing trong Bash DevOps: Grep, Awk, Sed Hiệu Quả
- Bài 6. Function trong Bash DevOps: Tái Sử Dụng Code Hiệu Quả
- Bài 7. Quản Lý Biến và Môi Trường trong Bash DevOps
- Bài 8. Cron Job trong Bash DevOps: Tự Động Hóa Theo Lịch Hiệu Quả
- Bài 9. Debug trong Bash DevOps: Tìm và Sửa Lỗi Hiệu Quả
- Bài 10. Error Handling Bash DevOps: Xử Lý Ngoại Lệ Hiệu Quả
- Bài 11. Bash trong CI/CD DevOps: Tích Hợp Pipeline Hiệu Quả
- 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 13. Tự Động Hóa SSH với Bash DevOps: Quản Lý Multi-Server Hiệu Quả
- Bài 14. Bash và Docker trong DevOps: Quản Lý Container Hiệu Quả
- Bài 15. Monitoring với Bash DevOps: Báo Cáo Hệ Thống Hiệu Quả
- Bài 16. Bash Nâng Cao: Parallel Execution trong DevOps Hiệu Quả
- Bài 17. Bash và API trong DevOps: Gọi và Xử Lý API Hiệu Quả
- Bài 18. Bash và Cloud CLI trong DevOps: Quản Lý Cloud Hiệu Quả
- Bài 19. Bash và Security trong DevOps: Bảo Mật Script Hiệu Quả
- Bài 20. Best Practice trong Bash DevOps: Làm Chủ Script Hiệu Quả
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
-
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
-
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
-
Dùng
source
:- Tạo
config.env
:DB_HOST="localhost" DB_PORT=5432
- Load:
source ./config.env echo "$DB_HOST:$DB_PORT"
- Tạo
-
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
-
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
- Kết quả mẫu:
-
Với ngưỡng tùy chỉnh:
DISK_THRESHOLD=50 ./env_check.sh
- Kết quả: Ngưỡng thay đổi thành 50%.
-
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.