环境检查脚本怎么写?

wen 实用脚本 68

环境检查脚本怎么写?一文掌握核心逻辑与实战模板

目录导读

  1. 为什么需要环境检查脚本 – 场景与痛点分析
  2. 环境检查脚本的核心构成 – 五大模块拆解
  3. 实战:从零编写一个通用环境检查脚本(附模板)
  4. 常见问题与避坑指南(Q&A)
  5. 进阶技巧:如何让脚本适配CI/CD与多环境

为什么需要环境检查脚本?

在项目部署、DevOps流水线或日常运维中,环境不一致是导致故障的头号原因。

环境检查脚本怎么写?

  • 开发机上Python 3.9,生产环境却只有3.6;
  • 依赖库版本缺失或冲突;
  • 端口被占用、磁盘空间不足、防火墙规则未开放。

环境检查脚本的作用就是自动检测当前系统是否符合预设条件,并在不合规时给出明确提示或自动修复,它能显著降低人工排查成本,提升部署成功率。


环境检查脚本的核心构成

一个健壮的环境检查脚本通常包含以下五个模块:

前提条件定义

明确脚本需要哪些外部命令(如curlgitpython3)、最低版本、环境变量。

检查函数库

针对不同检查项编写独立函数,便于复用和调试,常见检查项包括:

  • 命令是否存在
  • 版本号比较
  • 端口连通性
  • 磁盘/内存阈值
  • 文件权限

结果输出与报告

统一输出格式(如[PASS] / [FAIL]),支持彩色终端输出或JSON格式导出。

错误处理与退出逻辑

遇到关键项失败时立即退出(exit 1),非关键项可仅警告。

可配置化

通过环境变量或配置文件定义检查阈值,避免硬编码。


实战:从零编写一个通用环境检查脚本(Bash版)

以下是一个可直接使用的模板,适用于Linux/Mac环境。

#!/bin/bash
# ======================================
# 通用环境检查脚本 v1.0
# 用法: bash env_check.sh [--json]
# ======================================
set -euo pipefail
# 配置区域
MIN_PYTHON_VERSION="3.8"
MIN_DISK_GB=10
REQUIRED_CMDS=("curl" "git" "python3" "docker")
WARN_ONLY=("jq" "kubectl")   # 可选命令,不阻塞
# 颜色输出
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
# 统计
PASS=0
FAIL=0
WARN=0
# 检查命令是否存在
check_cmd() {
    if command -v "$1" &> /dev/null; then
        echo -e "$1 ... ${GREEN}PASS${NC}"
        ((PASS++))
    else
        echo -e "$1 ... ${RED}FAIL (未安装)${NC}"
        ((FAIL++))
        return 1
    fi
}
# 检查版本号 >= 目标版本
check_version() {
    local cmd=$1
    local min_ver=$2
    local ver_str
    ver_str=$($cmd --version 2>/dev/null | head -1 | grep -oE "[0-9]+\.[0-9]+\.[0-9]+" | head -1)
    if [[ -z "$ver_str" ]]; then
        echo -e "$cmd 版本 ... ${RED}FAIL (无法获取版本)${NC}"
        ((FAIL++))
        return 1
    fi
    if [[ "$ver_str" > "$min_ver" || "$ver_str" == "$min_ver" ]]; then
        echo -e "$cmd 版本 $ver_str ... ${GREEN}PASS${NC}"
        ((PASS++))
    else
        echo -e "$cmd 版本 $ver_str ... ${RED}FAIL (需 >= $min_ver)${NC}"
        ((FAIL++))
    fi
}
# 检查磁盘空间
check_disk() {
    local avail_gb
    avail_gb=$(df / | tail -1 | awk '{print $4}')
    avail_gb=$(( avail_gb / 1024 / 1024 ))
    if [[ "$avail_gb" -ge "$MIN_DISK_GB" ]]; then
        echo -e "磁盘空间 ${avail_gb}GB ... ${GREEN}PASS${NC}"
        ((PASS++))
    else
        echo -e "磁盘空间 ${avail_gb}GB ... ${RED}FAIL (需 >= ${MIN_DISK_GB}GB)${NC}"
        ((FAIL++))
    fi
}
# 主流程
echo "=================================="
echo "  环境检查开始 - $(date)"
echo "=================================="
# 1. 检查核心命令
for cmd in "${REQUIRED_CMDS[@]}"; do
    check_cmd "$cmd"
done
# 2. 特定版本检查
check_version "python3" "$MIN_PYTHON_VERSION"
# 3. 资源检查
check_disk
# 4. 可选命令(仅警告)
for cmd in "${WARN_ONLY[@]}"; do
    if ! command -v "$cmd" &> /dev/null; then
        echo -e "$cmd ... ${YELLOW}WARN (可选,不影响核心)${NC}"
        ((WARN++))
    fi
done
# 5. 汇总
echo "=================================="
echo -e "结果: ${GREEN}${PASS} PASS${NC}, ${RED}${FAIL} FAIL${NC}, ${YELLOW}${WARN} WARN${NC}"
if [[ "$FAIL" -gt 0 ]]; then
    echo -e "${RED}环境检查未通过!请修复后重试。${NC}"
    exit 1
else
    echo -e "${GREEN}环境检查通过!${NC}"
fi

使用说明

  • 将脚本保存为env_check.sh,赋予执行权限 chmod +x env_check.sh
  • 直接运行 bash env_check.sh 即可看到彩色输出。
  • 如需集成到CI/CD,可添加 --json 参数(扩展实现),输出结构化结果。

常见问题与避坑指南(Q&A)

Q1:脚本在macOS上运行报错“[[ ]]”语法不支持?
→ 默认macOS的bash是3.2版本,不支持某些特性,解决方案:使用#!/usr/bin/env bash,或安装新版bash(brew install bash),或改用sh兼容语法。

Q2:如何检查网络端口是否可达?
→ 使用nc -z -w 3 <host> <port>(netcat)或timeout 3 bash -c "echo > /dev/tcp/<host>/<port>",注意:后者依赖Bash内置的/dev/tcp,并非所有系统都启用。

Q3:脚本中如何避免“未定义的变量”导致中断?
→ 脚本开头添加set -uset -o nounset,这样引用未定义变量会立即报错,模板中的set -euo pipefail已包含此功能。

Q4:Windows环境怎么用?
→ 推荐使用PowerShell脚本,或通过WSL(Windows Subsystem for Linux)运行Bash脚本,Windows Server场景可使用PowerShell的Test-PathGet-Command等cmdlet。

Q5:如何让检查脚本输出中文?
→ 脚本内直接写中文,但注意文件编码必须为UTF-8,终端也要支持中文显示,同时可在echo语句中保留英文关键词(如[PASS])以兼容日志解析。


进阶技巧:让脚本适配CI/CD与多环境

支持JSON输出

在脚本中加入参数解析逻辑:

if [[ "$1" == "--json" ]]; then
    # 输出为JSON,方便CI工具(如Jenkins、GitLab CI)解析
    echo "{\"status\": \"${status}\", \"passed\": ${PASS}, \"failed\": ${FAIL}}"
fi

利用配置文件

创建env_config.yaml.env文件,脚本运行时读取配置:

required:
  - curl
  - git
min_python: "3.8"
disk_gb: 20

使用yqgrep解析,避免硬编码。

多环境差异控制

通过环境变量$ENV区分开发、测试、生产:

if [[ "$ENV" == "production" ]]; then
    # 生产环境额外检查:SSL证书、防火墙规则
    check_ssl_cert
    check_firewall_rule "443"
fi

自动修复(谨慎使用)

对部分简单问题(如缺少命令)自动安装:

if ! command -v jq &>/dev/null; then
    echo "正在安装jq..."
    apt-get update && apt-get install -y jq  # 或brew install jq
fi

注意:自动修复需要有sudo权限,且需确认不会影响现有环境。


通过以上方法,你可以快速构建一个符合团队需求的环境检查脚本,关键原则是:明确可配置、结果可读、故障可定位,如果你有更复杂的检查需求(如数据库连接、API可用性),可以基于此模板扩展,别忘了将脚本纳入版本管理,并在每次部署前自动运行一次。

抱歉,评论功能暂时关闭!