本次检查的核心是判定物理机是否同时满足「3.10内核」「ali2013及后续版本」「IPv6开启」三项条件,以下分「手动单台检查」和「批量自动化检查」两种方法详细说明,覆盖操作步骤、结果判断、注意事项。
前置准备
无论哪种检查方法,都需要先完成以下准备工作,确保检查顺利执行:
操作机(执行命令/脚本的机器)需能访问目标API地址(127.0.0.1:7070),获取物理机列表。
操作机需配置与所有目标物理机的免密SSH登录,避免频繁输入密码影响效率。
# 配置免密登录(替换为实际物理机主机名,执行后输入物理机登录密码即可完成授权) ssh-copy-id c23f06001.cloud.f06.amtest48
确保操作机已安装curl、grep、awk工具(Linux系统默认自带,无需额外安装)。
步骤1:获取目标物理机主机名
先通过API提取需要检查的物理机列表(非虚拟机、tianji项目),命令如下:
# 提取物理机主机名,输出结果可直接复制用于后续单台检查 curl -s '127.0.0.1:7070/api/v3/column/m.id?m.project=tianji&m.sm_name!=VM' | grep "m.id" | awk '{print $2}'
执行后得到物理机主机名列表,示例:
c23f06001.cloud.f06.amtest48 c23f10134.cloud.f11.amtest48
步骤2:单台物理机三项条件逐一检查
选取列表中的一台物理机(以c23f06001.cloud.f06.amtest48为例),依次执行以下3条检查命令,记录每条命令的执行结果。
条件1:检查是否为3.10内核
执行命令:
ssh c23f06001.cloud.f06.amtest48 "uname -r | grep 3.10"
结果判断:
满足(符合条件1):命令输出包含3.10的内核版本号,示例输出:3.10.0-ali2013.el7.x86_64
不满足(不符合条件1):命令无任何输出,返回空
条件2:检查是否为ali2013及后续版本
执行命令:
ssh c23f06001.cloud.f06.amtest48 "uname -r | grep ali201"
结果判断:
满足(符合条件2):命令输出包含ali201的内核版本号,示例输出:3.10.0-ali2013.el7.x86_64(ali2013)、3.10.0-ali2019.el7.x86_64(ali2019)
不满足(不符合条件2):命令无任何输出,返回空
条件3:检查是否开启IPv6
执行命令:
ssh c23f06001.cloud.f06.amtest48 "cat /proc/cmdline | grep ipv6.disable=0"
结果判断:
满足(符合条件3):命令输出包含ipv6.disable=0的内核启动参数,示例输出:BOOT_IMAGE=/vmlinuz-3.10.0-ali2013.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet ipv6.disable=0
不满足(不符合条件3):命令无任何输出,返回空
步骤3:最终结果判定
汇总单台物理机的3项条件检查结果,按照以下逻辑判定最终是否通过:
检查不通过:3项条件全部满足(均有有效输出)
检查通过:任意1项及以上条件不满足(至少1项无输出)
手动检查示例
物理机主机名 |
条件1结果 |
条件2结果 |
条件3结果 |
最终判定 |
c23f06001.cloud.f06.amtest48 |
有输出(3.10内核) |
有输出(ali2013) |
有输出(IPv6开启) |
检查不通过 |
c23f10134.cloud.f11.amtest48 |
无输出(5.4内核) |
有输出(ali2013) |
有输出(IPv6开启) |
检查通过 |
批量自动化检查
当物理机数量较多时,手动单台检查效率低下,可通过Shell脚本封装所有逻辑,实现「自动获取列表→批量轮询检查→自动汇总结果」,无需人工干预。
步骤1:编写批量检查脚本
创建脚本文件physical_machine_batch_check.sh,内容如下(包含完整逻辑和容错处理):
#!/bin/bash # 物理机三项条件批量检查脚本 # 功能:自动获取物理机列表,批量验证3项条件,输出最终检查结果 # 定义临时文件存储物理机列表 TEMP_LIST="/tmp/physical_machines_check.list" # 步骤1:自动获取目标物理机列表 echo "========================================" echo "开始获取tianji项目非VM物理机列表..." curl -s '127.0.0.1:7070/api/v3/column/m.id?m.project=tianji&m.sm_name!=VM' | grep "m.id" | awk '{print $2}' > $TEMP_LIST # 容错:检查是否获取到有效列表 if [ ! -s $TEMP_LIST ]; then echo "错误:未获取到任何物理机列表!请检查API接口或项目配置。" echo "========================================" exit 1 fi # 统计物理机数量 MACHINE_COUNT=$(wc -l < $TEMP_LIST) echo "成功获取到 $MACHINE_COUNT 台物理机,开始批量检查..." echo "========================================" # 步骤2:批量轮询物理机,执行三项条件检查 while read -r HOSTNAME; do # 跳过空行(避免列表异常导致报错) if [ -z "$HOSTNAME" ]; then continue fi echo "正在检查物理机:$HOSTNAME" # 执行三项条件检查,通过返回值判断是否满足(0=满足,非0=不满足) # 增加SSH连接超时5秒,避免单台机器不可达导致脚本卡顿 ssh -o ConnectTimeout=5 $HOSTNAME "uname -r | grep 3.10" > /dev/null 2>&1 CONDITION_1=$? ssh -o ConnectTimeout=5 $HOSTNAME "uname -r | grep ali201" > /dev/null 2>&1 CONDITION_2=$? ssh -o ConnectTimeout=5 $HOSTNAME "cat /proc/cmdline | grep ipv6.disable=0" > /dev/null 2>&1 CONDITION_3=$? # 步骤3:自动判定最终结果并输出 if [ $CONDITION_1 -eq 0 ] && [ $CONDITION_2 -eq 0 ] && [ $CONDITION_3 -eq 0 ]; then echo "结果:❌ 检查不通过(同时满足3.10内核、ali2013+版本、IPv6开启)" else echo "结果:✅ 检查通过" fi echo "----------------------------------------" done < $TEMP_LIST # 步骤4:清理临时文件,完成检查 rm -f $TEMP_LIST echo "批量检查完成!共检查 $MACHINE_COUNT 台物理机。" echo "========================================"
步骤2:执行批量检查脚本
- 赋予脚本执行权限:
chmod +x physical_machine_batch_check.sh
- 运行脚本:
./physical_machine_batch_check.sh
步骤3:查看批量检查结果
脚本执行过程中,会实时输出每台物理机的检查进度和最终结果,示例输出:
======================================== 开始获取tianji项目非VM物理机列表... 成功获取到 2 台物理机,开始批量检查... ======================================== 正在检查物理机:c23f06001.cloud.f06.amtest48 结果:❌ 检查不通过(同时满足3.10内核、ali2013+版本、IPv6开启) ---------------------------------------- 正在检查物理机:c23f10134.cloud.f11.amtest48 结果:✅ 检查通过 ---------------------------------------- 批量检查完成!共检查 2 台物理机。 ========================================