#!/usr/bin/env bash # 离线「全量」自检:与 CI 同源(labs 索引、verify 清单校验)+ # 对关键 playbook 执行 ansible-playbook --syntax-check。 # 不连接集群、不执行 kubectl;真机验收仍用 ./scripts/verify.sh full。 set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" # shellcheck disable=SC1091 source "${ROOT}/scripts/lib-ansible-lab.sh" ansible_lab_export_config INV="${ANSIBLE_INVENTORY:-${ROOT}/ansible/inventory.ini}" need_cmd() { if ! command -v "$1" >/dev/null 2>&1; then echo "[ERR] 未找到命令:$1" >&2 exit 1 fi } echo "########################################## 1/2 verify playbook ↔ docs 文件存在性" need_cmd python3 python3 "${ROOT}/scripts/validate_matrix_playbooks.py" echo "" echo "########################################## 2/2 Ansible syntax-check(verify playbook)" need_cmd ansible-playbook [[ -f "$INV" ]] || { echo "[ERR] inventory 不存在:$INV(syntax-check 仍需 -i)" >&2 exit 1 } mapfile -t PBS < <( ROOT="${ROOT}" python3 -c " import os from pathlib import Path root = Path(os.environ['ROOT']) pbs = [] for p in sorted((root / 'ansible' / 'playbooks' / 'verify').glob('*.yml')): if p.name.startswith('_'): continue pbs.append(p.relative_to(root).as_posix()) seen = set() for rel in pbs: if rel in seen: continue seen.add(rel) print(rel) " ) n=${#PBS[@]} i=0 for rel in "${PBS[@]}"; do i=$((i + 1)) pb="${ROOT}/${rel}" echo "[$i/$n] -- $rel" ansible-playbook -i "$INV" "$pb" --syntax-check done echo "" echo "[OK] 全量离线检查通过(${n} 条 playbook syntax-check)"