#!/usr/bin/env bash # 验证矩阵自动化入口(对应 docs/00-05 §2「自动化验证流程」步骤 4~6 的一键串联): # 4 断言 — 各 verify/XX-YY.yml 内 kubectl / curl / helm 等 # 5 收尾 — 默认 VERIFY_TEARDOWN=1 做本篇资源清理(非整集群卸载) # 6 串联 — run-all 按 docs/00-02-验证矩阵.md 顺序 fail-fast # # 步骤 1~3(接入、环境/轻量清理、部署)由操作者或 scripts/deploy-lab.sh 完成;本脚本不执行 k3s-uninstall。 # 推荐在 Linux 工作机(如 ylc65)或控制节点仓库根执行。 set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" MATRIX_MD="${ROOT}/docs/00-02-验证矩阵.md" # 默认与 §2 一致:验证后清理临时资源 export VERIFY_TEARDOWN="${VERIFY_TEARDOWN:-1}" load_env() { if [[ -f "${ROOT}/scripts/.env.verify" ]]; then set -a # shellcheck disable=SC1091 source "${ROOT}/scripts/.env.verify" set +a echo "[OK] 已加载 scripts/.env.verify" fi export VERIFY_TEARDOWN="${VERIFY_TEARDOWN:-1}" } parse_doc_ids_from_matrix() { if [[ ! -f "${MATRIX_MD}" ]]; then echo "[ERR] matrix 不存在:${MATRIX_MD}" >&2 exit 1 fi # shellcheck disable=SC2016 awk ' match($0, /`[0-9][0-9]-[0-9][0-9]-[^`]+\.md`/) { s = substr($0, RSTART+1, RLENGTH-2); id = substr(s, 1, 5); if (!seen[id]++) print id; } ' "${MATRIX_MD}" } print_flow() { cat < / run-all → ansible/playbooks/verify/.yml 5 收尾与记录 VERIFY_TEARDOWN;矩阵状态见 docs/00-02-验证矩阵.md(建议手工写回) 6 一键串联 $0 run-all 相关脚本:deploy-lab.sh(安装/铺栈)、ssh/run-phase2-k3s-on-ylc61-as-jack.sh(办公机触发远端 deploy k3s) EOF } preflight() { local inv="${ANSIBLE_INVENTORY:-${ROOT}/ansible/inventory.ini}" if ! command -v ansible-playbook >/dev/null 2>&1; then echo "[ERR] 未找到 ansible-playbook" >&2 exit 1 fi [[ -f "${MATRIX_MD}" ]] || { echo "[ERR] 缺少验证矩阵:${MATRIX_MD}" >&2; exit 1; } [[ -f "$inv" ]] || { echo "[ERR] inventory 不存在:$inv" >&2; exit 1; } echo "[RUN] ansible k3s_server -m ping" ansible k3s_server -i "$inv" -m ping if [[ "${VERIFY_PREFLIGHT_CLUSTER:-0}" == "1" ]]; then echo "[RUN] kubectl get nodes(控制节点,需已安装 K3s)" ansible k3s_server -i "$inv" -b -m ansible.builtin.shell -a \ 'KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl get nodes' \ || { echo "[WARN] 集群侧检查失败:若尚未 deploy k3s,可忽略;装好后设 VERIFY_PREFLIGHT_CLUSTER=1 再测" >&2 exit 1 } else echo "[TIP] 跳过 kubectl 检查。已装 K3s 时可执行:VERIFY_PREFLIGHT_CLUSTER=1 $0 preflight" fi echo "[OK] preflight 通过" } usage() { cat <<'EOF' 用法:scripts/verify.sh <命令> [...] 命令: flow 打印与 docs/00-05 §2 对齐的「验证流程」说明(不接 Ansible) preflight 检查 ansible-playbook、矩阵与 inventory;对 k3s_server 做 ping 若 VERIFY_PREFLIGHT_CLUSTER=1,额外 kubectl get nodes(未装集群会失败) list 从验证矩阵列出 doc_id(顺序同 run-all) run 运行指定 doc_id(ansible/playbooks/verify/.yml) run-all 按验证矩阵顺序运行全部 doc_id(fail-fast) 环境变量: VERIFY_TEARDOWN=1 验证后清理本篇资源(默认 1,对应 §2 轻量 teardown) VERIFY_PREFLIGHT_CLUSTER 为 1 时 preflight 额外执行 kubectl get nodes ANSIBLE_INVENTORY 默认 <仓库>/ansible/inventory.ini nginx_entry_base 例如 http://192.168.2.61(02-xx / 03-02 等 HTTP 校验) nodejs_entry_base 例如 http://192.168.2.61(04-01) 与「部署」分工:安装 K3s / Longhorn / nginx 铺栈请用 ./scripts/deploy-lab.sh;矩阵验收请用本脚本。 示例: ./scripts/verify.sh flow ./scripts/verify.sh preflight export nginx_entry_base=http://192.168.2.61 ./scripts/verify.sh run 02-05 EOF } ansible_verify() { local doc_id="$1" local inv="${ANSIBLE_INVENTORY:-${ROOT}/ansible/inventory.ini}" local pb_single="${ROOT}/ansible/playbooks/verify/${doc_id}.yml" if [[ ! -f "$inv" ]]; then echo "[ERR] inventory 不存在:$inv" >&2 exit 1 fi if [[ ! -f "$pb_single" ]]; then echo "[ERR] verify playbook 不存在(fail-fast):$pb_single" >&2 exit 1 fi echo "[RUN] ansible-playbook -i $inv $pb_single" ansible-playbook -i "$inv" "$pb_single" } main() { load_env local cmd="${1:-}" case "$cmd" in ""|-h|--help) usage ;; flow) print_flow ;; preflight) preflight ;; list) parse_doc_ids_from_matrix ;; run) local doc_id="${2:?need doc_id like 02-05}" ansible_verify "$doc_id" ;; run-all) local id while IFS= read -r id; do echo "" echo "########################################## $id" ansible_verify "$id" done < <(parse_doc_ids_from_matrix) ;; *) echo "[ERR] unknown cmd: $cmd" >&2 usage exit 1 ;; esac } main "$@"