#!/usr/bin/env bash # Ansible 验证入口:以 docs/00-02-验证矩阵.md 为执行清单,逐个 doc_id 执行 verify playbook(deploy→verify→teardown)。 # 推荐在 ylc61(控制节点)仓库根执行。 set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" MATRIX_MD="${ROOT}/docs/00-02-验证矩阵.md" 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 } parse_doc_ids_from_matrix() { if [[ ! -f "${MATRIX_MD}" ]]; then echo "[ERR] matrix 不存在:${MATRIX_MD}" >&2 exit 1 fi # 从矩阵中提取形如 `XX-YY-*.md` 的文件名,输出 XX-YY(按出现顺序) # 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}" } usage() { cat <<'EOF' 用法:scripts/verify.sh <命令> [...] 命令: list 从验证矩阵列出 doc_id run 运行指定 doc_id(执行 ansible/playbooks/verify/.yml) run-all 按验证矩阵顺序运行全部 doc_id(fail-fast) 环境变量: VERIFY_TEARDOWN=1 验证后清理(默认 1) nginx_entry_base 例如 http://192.168.2.61(用于 02-05) nodejs_entry_base 例如 http://192.168.2.61(用于 04-01) 示例: export nginx_entry_base=http://192.168.2.61 export VERIFY_TEARDOWN=1 ./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 ;; 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 "$@"