chore: 对齐 00-05 §2 的部署与验证脚本

- 新增 deploy-lab.sh(k3s/longhorn/nginx 铺栈)与 ssh/run-phase2-k3s-on-ylc61-as-jack.sh
- verify.sh:flow/preflight、VERIFY_TEARDOWN 默认、注释与 §2 对应
- 更新 smoke-verify、README、.env.verify.example、根 README 与主要 playbook 头注释
- k3s-delete-lab-stacks 标明重度清场语义

Made-with: Cursor
This commit is contained in:
2026-03-26 07:32:08 +08:00
parent 8c43761962
commit 231b6713c4
16 changed files with 294 additions and 67 deletions

View File

@@ -18,7 +18,7 @@
- `README.md`:新手入口,看“要做什么、按什么顺序做”; - `README.md`:新手入口,看“要做什么、按什么顺序做”;
- `00-00-构建总览.md`:文档导航,看“下一步该看哪一篇”; - `00-00-构建总览.md`:文档导航,看“下一步该看哪一篇”;
- `00-01-k3s-基础概念.md`:概念速查,看“不懂的 K3s/Traefik/NetworkPolicy 术语”; - `00-01-k3s-基础概念.md`:概念速查,看“不懂的 K3s/Traefik/NetworkPolicy 术语”;
- `00-02-验证矩阵.md`:状态面板,看哪些文档已在真实环境跑通过”(当前以手工验证为准) - `00-02-验证矩阵.md`:状态面板,看哪些文档已在真实环境跑通过」;自动化复验用 `./scripts/verify.sh run-all`(见 `00-05`),矩阵里的状态/备注建议仍手工维护
目录约定很简单: 目录约定很简单:
@@ -32,7 +32,7 @@
打开 `docs/00-00-构建总览.md`,先把整体拓扑和机器分工看明白。 打开 `docs/00-00-构建总览.md`,先把整体拓扑和机器分工看明白。
2. **装 K3s 集群(两种方式二选一)** 2. **装 K3s 集群(两种方式二选一)**
- **自动化**:按 `docs/01-06-节点初始化-ansible-实践.md` 用 Ansible 一键完成 61~64 初始化 + server/worker 安装(已验证)。 - **自动化**:按 `docs/01-06-节点初始化-ansible-实践.md`,或在仓库根执行 `./scripts/deploy-lab.sh k3s`(可选 `K3S_PREPARE_STORAGE=true`完成 61~64 初始化 + server/worker(详见 `scripts/README.md`)。
- **手动**:先按 `docs/01-01-k3s-控制节点含traefik.md` 装控制节点 61再按 `docs/01-02-k3s-工作节点.md` 加工作节点 62~64。 - **手动**:先按 `docs/01-01-k3s-控制节点含traefik.md` 装控制节点 61再按 `docs/01-02-k3s-工作节点.md` 加工作节点 62~64。
3. **确认节点 Ready** 3. **确认节点 Ready**

View File

@@ -1,4 +1,5 @@
--- ---
# 部署docs/00-05 §2 步骤 3——local-path ConfigMapPVC 演示验收见 scripts/verify.sh run 03-05。
# 仅应用本仓库 local-path 实验室 ConfigMap不安装 Longhorn。在 k3s_server 上执行。 # 仅应用本仓库 local-path 实验室 ConfigMap不安装 Longhorn。在 k3s_server 上执行。
# 与 docs/03-05 中「方法一」一致真源ansible/files/03-05-local-path-config/local-path-config-lab.json # 与 docs/03-05 中「方法一」一致真源ansible/files/03-05-local-path-config/local-path-config-lab.json

View File

@@ -1,4 +1,8 @@
--- ---
# 部署docs/00-05 §2 步骤 3「正式安装类」——全集群 K3s + 节点准备(非 verify.sh 单条 teardown
# 前置§2 步骤 1 接入inventory/SSH步骤 2 可选 scripts/deploy-lab.sh 在 K3S_PREPARE_STORAGE=true 时先跑 k3s-prepare-storage.yml。
# 入口:仓库根 ./scripts/deploy-lab.sh k3s或 ansible-playbook -i ansible/inventory.ini ansible/playbooks/k3s-init-and-install.yml
- name: Verify /storage is a separate mount (optional) - name: Verify /storage is a separate mount (optional)
hosts: k3s_nodes hosts: k3s_nodes
become: true become: true

View File

@@ -1,4 +1,6 @@
--- ---
# 部署docs/00-05 §2 步骤 23 可选前置——数据盘 → /storage非矩阵验收
# 推荐经 scripts/deploy-lab.sh k3s 在 K3S_PREPARE_STORAGE=true 时自动串行;勿与 verify.sh run-all 混为同一含义。
# 可选在空白数据盘上创建单分区、ext4、fstab 并挂载到 k3s_data_dir默认 /storage # 可选在空白数据盘上创建单分区、ext4、fstab 并挂载到 k3s_data_dir默认 /storage
# 启用前在 group_vars/all.yml 设置 k3s_prepare_storage: true 与 k3s_data_disk_device如 /dev/vdb # 启用前在 group_vars/all.yml 设置 k3s_prepare_storage: true 与 k3s_data_disk_device如 /dev/vdb
# 会清空该磁盘上的数据。若 /storage 已是挂载点则跳过。 # 会清空该磁盘上的数据。若 /storage 已是挂载点则跳过。

View File

@@ -1,4 +1,5 @@
--- ---
# 部署docs/00-05 §2 步骤 3——Helm 铺栈;验收见 scripts/verify.sh run 03-07。
# Helm 安装 Longhorn与 docs/03-07 一致)。在控制节点执行,依赖 KUBECONFIG=/etc/rancher/k3s/k3s.yaml # Helm 安装 Longhorn与 docs/03-07 一致)。在控制节点执行,依赖 KUBECONFIG=/etc/rancher/k3s/k3s.yaml
# 变量group_vars/all.yml 中 longhorn_chart_version、longhorn_install_node_packages、longhorn_apply_local_path_lab # 变量group_vars/all.yml 中 longhorn_chart_version、longhorn_install_node_packages、longhorn_apply_local_path_lab

View File

@@ -1,4 +1,6 @@
--- ---
# 部署docs/00-05 §2 步骤 3——铺栈无按 doc_id 的断言/teardown
# 矩阵级验收请用 scripts/verify.sh run 02-01…02-05 或 run-all。
# Ansible 一键部署 nginx 矩阵M1M4 # Ansible 一键部署 nginx 矩阵M1M4
# 对应文档docs/02-05-nginx-验证矩阵-一键部署.md02-0102-04 分篇已整合) # 对应文档docs/02-05-nginx-验证矩阵-一键部署.md02-0102-04 分篇已整合)
# #

View File

@@ -1,4 +1,5 @@
--- ---
# 部署docs/00-05 §2 步骤 3——TLS 铺栈;验收见 scripts/verify.sh run 03-02 等。
# Ansible 一键部署 nginx 矩阵 TLS 版M1M4HTTPS # Ansible 一键部署 nginx 矩阵 TLS 版M1M4HTTPS
# 对应文档docs/03-02-k3s-traefik-acme.md # 对应文档docs/03-02-k3s-traefik-acme.md
# #

View File

@@ -1,4 +1,5 @@
--- ---
# 部署docs/00-05 §2 步骤 3——应用单文件 demo整链验收优先 scripts/verify.sh run 04-01。
# 一键应用 Node.js demo 清单(与 docs/04-0104-13 + ansible/files/04-01-nodejs-demo 对齐) # 一键应用 Node.js demo 清单(与 docs/04-0104-13 + ansible/files/04-01-nodejs-demo 对齐)
# #
# 执行(在仓库根目录): # 执行(在仓库根目录):

View File

@@ -40,7 +40,8 @@
- 将结论写回 [`docs/00-02-验证矩阵.md`](00-02-验证矩阵.md)(状态与备注),必要时更新对应 `docs/XX-YY-*.md` 中的命令或版本说明。 - 将结论写回 [`docs/00-02-验证矩阵.md`](00-02-验证矩阵.md)(状态与备注),必要时更新对应 `docs/XX-YY-*.md` 中的命令或版本说明。
6. **本仓库一键串联** 6. **本仓库一键串联**
- 在控制节点仓库根执行`./scripts/verify.sh run-all`(或 `run <XX-YY>`),即按矩阵顺序重复「部署 → 断言 → teardown」的自动化版本缺 playbook 会 **fail-fast** - **部署**(步骤 3`./scripts/deploy-lab.sh k3s` 等,见 [`scripts/README.md`](../scripts/README.md)。
- **验证**(步骤 46在仓库根执行 `./scripts/verify.sh run-all`(或 `run <XX-YY>`),按矩阵顺序重复「断言 → teardown」缺 playbook **fail-fast**。跑全量前可 `./scripts/verify.sh preflight``./scripts/verify.sh flow` 可打印与本节对应的步骤摘要。
### 2.1 局限与约定补全(建议在文档与 `verify/XX-YY.yml` 中写死) ### 2.1 局限与约定补全(建议在文档与 `verify/XX-YY.yml` 中写死)

View File

@@ -21,12 +21,12 @@ export K3S_SERVER_HOSTNAME="${K3S_SERVER_HOSTNAME:-ylc61}"
# 与 ansible group_vars 一致,验证磁盘/文档 00-04 时引用 # 与 ansible group_vars 一致,验证磁盘/文档 00-04 时引用
export K3S_DATA_DIR="${K3S_DATA_DIR:-/storage}" export K3S_DATA_DIR="${K3S_DATA_DIR:-/storage}"
# --- Ansible安装/复验 k3s--- # --- Ansible安装/复验 k3s;对应 docs/00-05 §2 步骤 3---
export ANSIBLE_INVENTORY="${ANSIBLE_INVENTORY:-$(pwd)/ansible/inventory.ini}" export ANSIBLE_INVENTORY="${ANSIBLE_INVENTORY:-$(pwd)/ansible/inventory.ini}"
# phase2run-phase2-k3s-on-ylc61-as-jack.sh 或手工) # deploy-lab.sh k3s / ssh/run-phase2-k3s-on-ylc61-as-jack.sh
# 为 true 时先跑 k3s-prepare-storage.yml须与 group_vars 一致 # 为 true 时先跑 k3s-prepare-storage.yml传 -e k3s_prepare_storage=true磁盘变量见 group_vars
export K3S_PREPARE_STORAGE="${K3S_PREPARE_STORAGE:-false}" export K3S_PREPARE_STORAGE="${K3S_PREPARE_STORAGE:-false}"
# phase2 建议在控制节点 ylc61 上执行(本机有 ansible-playbook办公机无 ansible 时用 phase2-print 复制命令到 ylc61 # 建议在控制节点或 Linux 工作机执行 deploy-lab.sh办公机可用 run-phase2-k3s-on-ylc61-as-jack.sh 触发远端
# --- SSH 密钥命名(与 scripts/ssh/test-ssh.sh 默认一致;脚本内尚为硬编码路径)--- # --- SSH 密钥命名(与 scripts/ssh/test-ssh.sh 默认一致;脚本内尚为硬编码路径)---
# test-ssh 使用:$K3S_SSH_KEY_DIR/${K3S_SSH_KEY_PREFIX}<inventory主机名> # test-ssh 使用:$K3S_SSH_KEY_DIR/${K3S_SSH_KEY_PREFIX}<inventory主机名>
@@ -38,8 +38,9 @@ export SSH_USER="${SSH_USER:-jack}"
# test-ssh.sh连接超时秒数脚本已支持环境变量 TIMEOUT_SEC # test-ssh.sh连接超时秒数脚本已支持环境变量 TIMEOUT_SEC
export TIMEOUT_SEC="${TIMEOUT_SEC:-5}" export TIMEOUT_SEC="${TIMEOUT_SEC:-5}"
# ---(旧自动验证已下线--- # --- 矩阵验证docs/00-05 §2 步骤 46---
# 如果你要重新落地自动化验证,请参考 docs/00-05 的测试框架设计说明。 # ./scripts/verify.sh run | run-all | preflight | flow
# VERIFY_TEARDOWN默认 1、VERIFY_PREFLIGHT_CLUSTER为 1 时 preflight 额外 kubectl get nodes
# --- SSH第三方验证机 onecloud不忽略矩阵里多处依赖「集群外」curl/探测)--- # --- SSH第三方验证机 onecloud不忽略矩阵里多处依赖「集群外」curl/探测)---
# 用途示例02-xx nginx 矩阵从第三方访问 Ingress01-07 经 onecloud 对 OpenWrt:18080/18443 发 curl # 用途示例02-xx nginx 矩阵从第三方访问 Ingress01-07 经 onecloud 对 OpenWrt:18080/18443 发 curl
@@ -49,8 +50,9 @@ export ONECLOUD_SSH="${ONECLOUD_SSH:-ssh -o BatchMode=yes onecloud}"
# 若需显式密钥,可写完整一行,例如: # 若需显式密钥,可写完整一行,例如:
# export ONECLOUD_SSH="ssh -o BatchMode=yes -i ~/.ssh/id_ed25519_onecloud onecloud" # export ONECLOUD_SSH="ssh -o BatchMode=yes -i ~/.ssh/id_ed25519_onecloud onecloud"
# --- NFS03-06服务端与导出路径;若需在服务端执行清理命令可填 SSH --- # --- NFS03-06verify playbook 使用 NFS_SERVER_IP / NFS_EXPORT_PATH ---
export NFS_SERVER_HOST="${NFS_SERVER_HOST:-YOUR_NFS_IP_OR_HOSTNAME}" export NFS_SERVER_HOST="${NFS_SERVER_HOST:-YOUR_NFS_IP_OR_HOSTNAME}"
export NFS_SERVER_IP="${NFS_SERVER_IP:-$NFS_SERVER_HOST}"
export NFS_EXPORT_PATH="${NFS_EXPORT_PATH:-/export/k3s}" export NFS_EXPORT_PATH="${NFS_EXPORT_PATH:-/export/k3s}"
# export NFS_SSH="ssh -o BatchMode=yes root@${NFS_SERVER_HOST}" # export NFS_SSH="ssh -o BatchMode=yes root@${NFS_SERVER_HOST}"
@@ -96,7 +98,11 @@ export ARMV7_NFS_SSH="${ARMV7_NFS_SSH:-$ARMV7_SSH}"
# 01-07 文档中第三方 curl 用 --https-hosts 时的主机列表(逗号分隔,与 VERIFY_TLS_HOSTS 可相同) # 01-07 文档中第三方 curl 用 --https-hosts 时的主机列表(逗号分隔,与 VERIFY_TLS_HOSTS 可相同)
# export OPENWRT_VERIFY_HTTPS_HOSTS="test01.jackadam.top,..." # export OPENWRT_VERIFY_HTTPS_HOSTS="test01.jackadam.top,..."
# --- 与现有 scripts/*.sh 对照(未列出的脚本不在仓库内)--- # --- 与 scripts/*.sh 对照 ---
# verify.sh → VERIFY_TEARDOWN, VERIFY_PREFLIGHT_CLUSTER, nginx_entry_base, ANSIBLE_INVENTORY
# deploy-lab.sh → ANSIBLE_INVENTORY, K3S_PREPARE_STORAGE
# ssh/run-phase2-k3s-on-ylc61-as-jack.sh → LAB_REPO_ROOT, K3S_PREPARE_STORAGE传远端
# ssh/smoke-verify-matrix-on-ylc61.sh → VERIFY_REPO_ROOT, VERIFY_TEARDOWN, nginx_entry_base
# cloudflare-delete-acme-challenge-dns.sh → CF_API_TOKEN, ZONE_NAME, ZONE_ID # cloudflare-delete-acme-challenge-dns.sh → CF_API_TOKEN, ZONE_NAME, ZONE_ID
# k3s-delete-lab-stacks.sh → KUBECONFIG # k3s-delete-lab-stacks.sh → KUBECONFIG
# ssh/test-ssh.sh → TIMEOUT_SEC密钥路径当前固定为 $HOME/.ssh/id_ed25519_k3s_<host> # ssh/test-ssh.sh → TIMEOUT_SEC密钥路径当前固定为 $HOME/.ssh/id_ed25519_k3s_<host>

View File

@@ -1,70 +1,85 @@
# Scripts 总览 # Scripts 总览
本目录集中维护通用运维脚本。统一约定:**在仓库根目录执行**,使用 `./scripts/...` 路径调用。 本目录集中维护通用运维脚本。约定:**在仓库根目录执行**,使用 `./scripts/...` 路径调用。
流程说明与「部署 / 验证」分工以 [`docs/00-05-测试与验证框架.md`](../docs/00-05-测试与验证框架.md) **§2 自动化验证流程** 为准;下表与之一一对应。
| §2 步骤 | 含义 | 本仓库入口 |
|--------|------|------------|
| 1 接入 | inventory、仓库同步、加载 `.env.verify` | 手工;`verify.sh` / `deploy-lab.sh` 会自动 `source scripts/.env.verify`(若存在) |
| 2 环境/清理 | 轻量:各 verify 的 teardown重度清实验负载 / 重装 K3s | 轻量:`VERIFY_TEARDOWN`(默认 1重度`k3s-delete-lab-stacks.sh`、文档中的 `k3s-uninstall`**勿**默认进 `run-all` |
| 3 部署 | K3s、Longhorn、nginx 矩阵等铺栈 | **`./scripts/deploy-lab.sh`**`k3s` / `longhorn` / `nginx-matrix` / `nginx-matrix-tls` |
| 45 断言与收尾 | 按 doc 目标 kubectl/curl本篇 teardown | **`./scripts/verify.sh`** `run` / `run-all` |
| 6 一键串联 | 按矩阵顺序跑全部 verify | **`./scripts/verify.sh run-all`** |
辅助命令:
- `./scripts/verify.sh flow` — 打印与 §2 对齐的流程说明(不接 Ansible
- `./scripts/verify.sh preflight` — 检查 `ansible-playbook`、矩阵、`inventory`,并对 `k3s_server` 执行 `ping`;若已装集群可设 `VERIFY_PREFLIGHT_CLUSTER=1` 再执行 `kubectl get nodes`
## 验证编排环境变量(可选) ## 验证编排环境变量(可选)
复制 [`scripts/.env.verify.example`](.env.verify.example) 为 `scripts/.env.verify` 并填写本机值;**勿提交** `scripts/.env.verify`(已在仓库 `.gitignore` 中忽略)。其中 **`ONECLOUD_SSH`**(默认 `ssh … onecloud`)用于矩阵里**集群外**第三方 curl 等验证,与 `SKIP_*` 无关;**`ARMV7_SSH` / `ARMV7_NFS_SSH`** 用于 `01-03` / `01-05` 实机,同样不属「可忽略」项,与 `SKIP_ARMV7=0` 配对使用。**`ACME_EMAIL`** 供 Traefik ACME`03-02` / `03-03`);另有 **`VERIFY_TLS_HOSTS`**、`K3S_SERVER_HOSTNAME``TIMEOUT_SEC``test-ssh.sh` 已读)、`LONGHORN_NAMESPACE` 等,完整列表与「和现有 `scripts/*.sh` 的对照」见 [`.env.verify.example`](.env.verify.example) 文末注释。加载示例: 复制 [`scripts/.env.verify.example`](.env.verify.example) 为 `scripts/.env.verify` 并填写本机值;**勿提交** `scripts/.env.verify`(已在仓库 `.gitignore` 中忽略)。
其中 **`ONECLOUD_SSH`** 用于矩阵里**集群外**第三方 curl 等;**`ARMV7_SSH` / `ARMV7_NFS_SSH`** 用于 `01-03` / `01-05` 实机;**`ACME_EMAIL`** 供 Traefik ACME`03-02` / `03-03`);另有 **`VERIFY_TLS_HOSTS`**、`K3S_SERVER_HOSTNAME``TIMEOUT_SEC``LONGHORN_NAMESPACE` 等,完整列表见 [`.env.verify.example`](.env.verify.example) 文末注释。
```bash ```bash
set -a && source scripts/.env.verify && set +a set -a && source scripts/.env.verify && set +a
``` ```
## 验证框架状态(自动化已移除 ## 部署 K3s推荐在控制节点或 Linux 工作机
旧的验证矩阵编排与静态校验 CI 已下线;`docs/00-02-验证矩阵.md` 仍作为“待验证列表/状态记录”,当前以手工验证为准 1. 在仓库根(或 `cd ansible` 后改用相对路径)执行 **`./scripts/deploy-lab.sh k3s`**。若需先准备数据盘,在 **本机或 `.env.verify`** 中设 `K3S_PREPARE_STORAGE=true`(会传 `-e k3s_prepare_storage=true``k3s-prepare-storage.yml`
2. 办公机无 Ansible 时,可 SSH 到 ylc61 再执行上述命令,或使用:
如果你要重新落地自动化验证框架,请以设计说明 [`docs/00-05-测试与验证框架.md`](../docs/00-05-测试与验证框架.md) 中的分层与 `doc_id` 映射约定为基线。
### 用 ylc61 跑 Ansible 装 K3s推荐
如果办公机Windows没有 `ansible-playbook`,有两种方式:
1. 方式 A把仓库同步到 `ylc61`,然后在 `ylc61` 上直接跑 playbook
```bash ```bash
sudo dnf install -y ansible # Fedora未装过时
cd ~/实验室建设 # 按你实际路径;若在 /home/jack 则相应 cd
cd ansible
# 可选:第二块盘 → /storage 先准备
# ansible-playbook -i inventory.ini playbooks/k3s-prepare-storage.yml
ansible-playbook -i inventory.ini playbooks/k3s-init-and-install.yml
```
2. 方式 B从办公机一键触发内部通过 SSH 在 `ylc61` 上以 `jack` 身份执行)
```bash
# 可选:先准备 /storage
export K3S_PREPARE_STORAGE=false # 或 true export K3S_PREPARE_STORAGE=false # 或 true
./scripts/ssh/run-phase2-k3s-on-ylc61-as-jack.sh ./scripts/ssh/run-phase2-k3s-on-ylc61-as-jack.sh
``` ```
**密钥在 jack**`inventory.ini` 中私钥路径会随执行用户变化。上述方式会确保在 `ylc61``jack` 身份运行,避免把私钥解析到 `/root/.ssh/` 环境变量 **`LAB_REPO_ROOT`**(仅 SSH 包装脚本使用)可指定远端仓库路径,默认 `/home/jack/实验室建设`
## 目录 **密钥与执行用户**`inventory.ini` 中私钥路径随执行用户变化;在 ylc61 上以 `jack` 执行可避免解析到 `/root/.ssh/`
- `scripts/k3s-delete-lab-stacks.sh`
- **按集群里实际资源**遍历删除:用 `kubectl get` 枚举各命名空间下的 Deployment/Service/Ingress/IngressRoute 等再 `kubectl delete`**不读仓库 YAML 目录**);默认跳过 `kube-system` 等系统命名空间;`--preview` 只列资源;`--namespaces` 限定 NS`--with-pvc` / `--with-configmaps` / `--with-secrets`(需 `jq`)按需打开 ## 验证矩阵run-all / 抽样 smoke
- `scripts/cloudflare-delete-acme-challenge-dns.sh`
- 批量删除 Cloudflare 中 `_acme-challenge` 相关 DNS 记录ACME 残留);环境变量或脚本内 `DEFAULT_*` 配置二选一,环境变量优先;`--dry-run` 仅列出不删除 ```bash
- `scripts/ssh/setup-k3s-workers-ssh.sh` ./scripts/verify.sh preflight
- 为 Ansible 自动化准备 SSH为所有 k3s 节点配置 jack + root 公钥及每节点私钥(配合 `docs/01-06-节点初始化-ansible-实践.md` export nginx_entry_base=http://192.168.2.61
- `scripts/ssh/test-ssh.sh` ./scripts/verify.sh run-all
- 验证 worker/client SSH key 登录与 sudo 可用性 ```
从办公机经 SSH 在远端仓库根跑抽样用例:
```bash
./scripts/ssh/smoke-verify-matrix-on-ylc61.sh
```
可用 **`VERIFY_REPO_ROOT`** 指定远端路径(默认 `/home/jack/实验室建设`)。
## 目录与脚本对照
- **`verify.sh`** — 矩阵验收:`flow` / `preflight` / `list` / `run` / `run-all`
- **`deploy-lab.sh`** — 安装/铺栈:`k3s` / `longhorn` / `nginx-matrix` / `nginx-matrix-tls`
- **`ssh/run-phase2-k3s-on-ylc61-as-jack.sh`** — 办公机触发远端 `deploy-lab.sh k3s`
- **`ssh/smoke-verify-matrix-on-ylc61.sh`** — 办公机触发远端若干 `verify.sh run`
- **`k3s-delete-lab-stacks.sh`** — 按 kubectl 实况清命名空间负载(重度清场,非默认 teardown
- **`cloudflare-delete-acme-challenge-dns.sh`** — 清理 CF 上 `_acme-challenge` DNS
- **`ssh/setup-k3s-workers-ssh.sh`** — 为 K3s 节点预配 SSH配合 `01-06`
- **`ssh/test-ssh.sh`** — 验证 worker 密钥登录与 sudo
## 从仓库根执行示例 ## 从仓库根执行示例
```bash ```bash
# 1) 初始化 worker SSH 密钥(可选)
./scripts/ssh/setup-k3s-workers-ssh.sh ./scripts/ssh/setup-k3s-workers-ssh.sh
# 2) 验证 SSH建议
./scripts/ssh/test-ssh.sh ./scripts/ssh/test-ssh.sh
./scripts/deploy-lab.sh k3s
# 3) 执行批量部署/配置(示例) ./scripts/verify.sh preflight
cd ansible ./scripts/verify.sh run 02-05
ansible-playbook -i inventory.ini playbooks/k3s-init-and-install.yml
``` ```
## 说明文档 ## 说明文档
- 主文档入口详见 `docs/00-00-构建总览.md` - 验证框架:[`docs/00-05-测试与验证框架.md`](../docs/00-05-测试与验证框架.md)
- 验证矩阵状态:[`docs/00-02-验证矩阵.md`](../docs/00-02-验证矩阵.md)
- 主文档入口:`docs/00-00-构建总览.md`(若存在)

80
scripts/deploy-lab.sh Normal file
View File

@@ -0,0 +1,80 @@
#!/usr/bin/env bash
# 实验室「正式部署」入口(对应 docs/00-05 §2 步骤 13与 verify.sh 的逐条验收 teardown 不同)。
# 在仓库根执行:./scripts/deploy-lab.sh <子命令>
#
# 步骤对应关系(详见 docs/00-05-测试与验证框架.md §2
# 1 接入 — 本机有 ansible-playbook、inventory 可达;可选加载 scripts/.env.verify
# 2 前置 — 可选 k3s-prepare-storage磁盘 → /storage非 k3s-uninstall 类重度清理
# 3 部署 — k3s-init-and-install 或其它子命令所列 playbook
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
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
}
usage() {
cat <<'EOF'
用法scripts/deploy-lab.sh <子命令>
子命令:
k3s 安装/复验 K3s可选先跑数据盘准备见环境变量
longhorn Helm 安装 Longhornansible/playbooks/longhorn-install.yml
nginx-matrix 部署 HTTP nginx 矩阵ansible/playbooks/nginx-matrix-deploy.yml
nginx-matrix-tls 部署 TLS nginx 矩阵ansible/playbooks/nginx-matrix-tls-deploy.yml
环境变量(节选,完整见 scripts/.env.verify.example
ANSIBLE_INVENTORY 默认 <仓库>/ansible/inventory.ini
K3S_PREPARE_STORAGE 为 true 时先执行 k3s-prepare-storage.yml并传 -e k3s_prepare_storage=true
说明:
「矩阵级验收」请用 ./scripts/verify.sh run / run-all本脚本只做安装/铺栈,不负责按 doc_id 做断言与 teardown。
EOF
}
ansible_wrap() {
local inv="${ANSIBLE_INVENTORY:-${ROOT}/ansible/inventory.ini}"
if [[ ! -f "$inv" ]]; then
echo "[ERR] inventory 不存在:$inv" >&2
exit 1
fi
if ! command -v ansible-playbook >/dev/null 2>&1; then
echo "[ERR] 未找到 ansible-playbook请先安装 Ansible" >&2
exit 1
fi
echo "[RUN] ansible-playbook -i $inv $*"
ansible-playbook -i "$inv" "$@"
}
cmd_k3s() {
if [[ "${K3S_PREPARE_STORAGE:-false}" == "true" ]]; then
ansible_wrap "${ROOT}/ansible/playbooks/k3s-prepare-storage.yml" -e 'k3s_prepare_storage=true'
fi
ansible_wrap "${ROOT}/ansible/playbooks/k3s-init-and-install.yml"
}
main() {
load_env
local sub="${1:-}"
case "$sub" in
""|-h|--help) usage ;;
k3s) cmd_k3s ;;
longhorn) ansible_wrap "${ROOT}/ansible/playbooks/longhorn-install.yml" ;;
nginx-matrix) ansible_wrap "${ROOT}/ansible/playbooks/nginx-matrix-deploy.yml" ;;
nginx-matrix-tls) ansible_wrap "${ROOT}/ansible/playbooks/nginx-matrix-tls-deploy.yml" ;;
*)
echo "[ERR] 未知子命令:$sub" >&2
usage
exit 1
;;
esac
}
main "$@"

View File

@@ -1,5 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# 按「集群里实际存在的资源」遍历删除(全部由 kubectl 发现,不读仓库 YAML 目录) # 按「集群里实际存在的资源」遍历删除(全部由 kubectl 发现,不读仓库 YAML 目录)
# 对应 docs/00-05 §2 步骤 2「重度清理」方向的实验室内清场非 verify.sh 默认 teardown亦非 k3s-uninstall
# 在任意目录执行均可;建议在仓库根:./scripts/k3s-delete-lab-stacks.sh [选项] # 在任意目录执行均可;建议在仓库根:./scripts/k3s-delete-lab-stacks.sh [选项]
# #
# 默认跳过系统命名空间kube-system、kube-public、kube-node-lease # 默认跳过系统命名空间kube-system、kube-public、kube-node-lease

View File

@@ -0,0 +1,25 @@
#!/usr/bin/env bash
# 在办公机执行:经 SSH 在控制节点 ylc61 上跑「K3s 安装/复验」部署流水线。
# 对应 docs/00-05 §2 步骤 1接入+ 3部署中的 k3s 路径;与 verify.sh 矩阵验收分离。
#
# 依赖:本机可 ssh ylc61BatchMode远端仓库路径存在且含 scripts/deploy-lab.sh。
set -euo pipefail
REMOTE_ROOT="${LAB_REPO_ROOT:-/home/jack/实验室建设}"
# 将当前 shell 中的 K3S_PREPARE_STORAGE 传到远端(未设置则默认 false
KS_PREP="${K3S_PREPARE_STORAGE:-false}"
exec ssh -o BatchMode=yes ylc61 bash -lc "
set -euo pipefail
cd '${REMOTE_ROOT}'
chmod +x scripts/deploy-lab.sh 2>/dev/null || true
if [[ -f scripts/.env.verify ]]; then
set -a
# shellcheck disable=SC1091
source scripts/.env.verify
set +a
fi
# 办公机传入的 K3S_PREPARE_STORAGE 覆盖远端 .env 中的默认
export K3S_PREPARE_STORAGE='${KS_PREP}'
./scripts/deploy-lab.sh k3s
"

View File

@@ -1,6 +1,35 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# 从办公机 Git Bash 执行:经 ssh 在 ylc61 上 smoke 跑样板 doc_id # 从办公机 Git Bash 执行:SSH 到 ylc61 上跑若干样板 verify对应 docs/00-05 §2 步骤 46 的抽样)
# 步骤 13 需已满足:远端仓库路径正确、已 deploy K3s、可选 scripts/.env.verify。
#
# 环境变量:
# VERIFY_REPO_ROOT 远端仓库根目录(默认 /home/jack/实验室建设)
# VERIFY_TEARDOWN / nginx_entry_base / nodejs_entry_base 传给远端 verify.sh
set -euo pipefail set -euo pipefail
exec ssh -o BatchMode=yes ylc61 'bash -lc "cd /home/jack && chmod +x scripts/verify.sh && export VERIFY_TEARDOWN=${VERIFY_TEARDOWN:-1} && export nginx_entry_base=${nginx_entry_base:-http://192.168.2.61} && export nodejs_entry_base=${nodejs_entry_base:-http://192.168.2.61} && ./scripts/verify.sh run 02-05 && ./scripts/verify.sh run 03-05 && ./scripts/verify.sh run 03-07 && ./scripts/verify.sh run 04-01"' REMOTE_ROOT="${VERIFY_REPO_ROOT:-/home/jack/实验室建设}"
TEARDOWN="${VERIFY_TEARDOWN:-1}"
NGX="${nginx_entry_base:-http://192.168.2.61}"
NODE="${nodejs_entry_base:-http://192.168.2.61}"
exec ssh -o BatchMode=yes ylc61 bash -lc "
set -euo pipefail
cd '${REMOTE_ROOT}'
chmod +x scripts/verify.sh 2>/dev/null || true
export VERIFY_TEARDOWN='${TEARDOWN}'
export nginx_entry_base='${NGX}'
export nodejs_entry_base='${NODE}'
if [[ -f scripts/.env.verify ]]; then
set -a
# shellcheck disable=SC1091
source scripts/.env.verify
set +a
fi
export VERIFY_TEARDOWN='${TEARDOWN}'
export nginx_entry_base='${NGX}'
export nodejs_entry_base='${NODE}'
./scripts/verify.sh run 02-05
./scripts/verify.sh run 03-05
./scripts/verify.sh run 03-07
./scripts/verify.sh run 04-01
"

View File

@@ -1,11 +1,19 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Ansible 验证入口:以 docs/00-02-验证矩阵.md 为执行清单,逐个 doc_id 执行 verify playbookdeploy→verify→teardown # 验证矩阵自动化入口(对应 docs/00-05 §2「自动化验证流程」步骤 46 的一键串联):
# 推荐在 ylc61控制节点仓库根执行。 # 4 断言 — 各 verify/XX-YY.yml 内 kubectl / curl / helm 等
# 5 收尾 — 默认 VERIFY_TEARDOWN=1 做本篇资源清理(非整集群卸载)
# 6 串联 — run-all 按 docs/00-02-验证矩阵.md 顺序 fail-fast
#
# 步骤 13接入、环境/轻量清理、部署)由操作者或 scripts/deploy-lab.sh 完成;本脚本不执行 k3s-uninstall。
# 推荐在 Linux 工作机(如 ylc65或控制节点仓库根执行。
set -euo pipefail set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
MATRIX_MD="${ROOT}/docs/00-02-验证矩阵.md" MATRIX_MD="${ROOT}/docs/00-02-验证矩阵.md"
# 默认与 §2 一致:验证后清理临时资源
export VERIFY_TEARDOWN="${VERIFY_TEARDOWN:-1}"
load_env() { load_env() {
if [[ -f "${ROOT}/scripts/.env.verify" ]]; then if [[ -f "${ROOT}/scripts/.env.verify" ]]; then
set -a set -a
@@ -14,6 +22,7 @@ load_env() {
set +a set +a
echo "[OK] 已加载 scripts/.env.verify" echo "[OK] 已加载 scripts/.env.verify"
fi fi
export VERIFY_TEARDOWN="${VERIFY_TEARDOWN:-1}"
} }
parse_doc_ids_from_matrix() { parse_doc_ids_from_matrix() {
@@ -21,7 +30,6 @@ parse_doc_ids_from_matrix() {
echo "[ERR] matrix 不存在:${MATRIX_MD}" >&2 echo "[ERR] matrix 不存在:${MATRIX_MD}" >&2
exit 1 exit 1
fi fi
# 从矩阵中提取形如 `XX-YY-*.md` 的文件名,输出 XX-YY按出现顺序
# shellcheck disable=SC2016 # shellcheck disable=SC2016
awk ' awk '
match($0, /`[0-9][0-9]-[0-9][0-9]-[^`]+\.md`/) { match($0, /`[0-9][0-9]-[0-9][0-9]-[^`]+\.md`/) {
@@ -32,23 +40,72 @@ parse_doc_ids_from_matrix() {
' "${MATRIX_MD}" ' "${MATRIX_MD}"
} }
print_flow() {
cat <<EOF
与 docs/00-05-测试与验证框架.md §2「自动化验证流程一般步骤」对应
1 接入目标环境 inventory + 仓库同步;可选 source scripts/.env.verify本脚本 run/run-all 会自动加载)
2 环境与前置清理 轻量:各 verify playbook 的 teardown重度 k3s 重装勿混进 run-all
3 部署 ./scripts/deploy-lab.sh k3s | longhorn | nginx-matrix* 或手工 ansible-playbook
4 断言 本脚本 run <XX-YY> / run-all → ansible/playbooks/verify/<XX-YY>.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() { usage() {
cat <<'EOF' cat <<'EOF'
用法scripts/verify.sh <命令> [...] 用法scripts/verify.sh <命令> [...]
命令: 命令:
list 从验证矩阵列出 doc_id flow 打印与 docs/00-05 §2 对齐的「验证流程」说明(不接 Ansible
run <XX-YY> 运行指定 doc_id执行 ansible/playbooks/verify/<XX-YY>.yml preflight 检查 ansible-playbook、矩阵与 inventory对 k3s_server 做 ping
若 VERIFY_PREFLIGHT_CLUSTER=1额外 kubectl get nodes未装集群会失败
list 从验证矩阵列出 doc_id顺序同 run-all
run <XX-YY> 运行指定 doc_idansible/playbooks/verify/<XX-YY>.yml
run-all 按验证矩阵顺序运行全部 doc_idfail-fast run-all 按验证矩阵顺序运行全部 doc_idfail-fast
环境变量: 环境变量:
VERIFY_TEARDOWN=1 验证后清理(默认 1 VERIFY_TEARDOWN=1 验证后清理本篇资源(默认 1,对应 §2 轻量 teardown
nginx_entry_base 例如 http://192.168.2.61(用于 02-05 VERIFY_PREFLIGHT_CLUSTER 为 1 时 preflight 额外执行 kubectl get nodes
nodejs_entry_base 例如 http://192.168.2.61(用于 04-01 ANSIBLE_INVENTORY 默认 <仓库>/ansible/inventory.ini
nginx_entry_base 例如 http://192.168.2.6102-xx / 03-02 等 HTTP 校验)
nodejs_entry_base 例如 http://192.168.2.6104-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 export nginx_entry_base=http://192.168.2.61
export VERIFY_TEARDOWN=1
./scripts/verify.sh run 02-05 ./scripts/verify.sh run 02-05
EOF EOF
} }
@@ -74,6 +131,8 @@ main() {
local cmd="${1:-}" local cmd="${1:-}"
case "$cmd" in case "$cmd" in
""|-h|--help) usage ;; ""|-h|--help) usage ;;
flow) print_flow ;;
preflight) preflight ;;
list) list)
parse_doc_ids_from_matrix parse_doc_ids_from_matrix
;; ;;
@@ -98,4 +157,3 @@ main() {
} }
main "$@" main "$@"