fix(macos): postgres brew install via command (clone-path patch) + docs

Add patch_playbook_postgres_macos() to rewrite the postgres macos.yml install
from the community.general.homebrew module (which can select a crashing stale
Intel Homebrew) to a brew command using the PATH brew, matching the playbooks
repo fix. Documents TC-MAC-018.
This commit is contained in:
Haitao Pan 2026-06-18 12:55:51 +00:00
parent 87bf91d655
commit 5c9b5d2ed0
3 changed files with 66 additions and 0 deletions

View File

@ -157,6 +157,16 @@
| **目录/模式策略** | macOS 部署 `postgresql_deploy_mode=native`(→ `macos.yml`brew 安装Linux 部署保持默认 `compose` |
| **修复方案** | 在 `setup-ai-workspace-all-in-one.sh` 的 Darwin 分支注入 `-e postgresql_deploy_mode=native`,并以 `append_secret_var postgresql_admin_password=$UNIFIED_AUTH_TOKEN` 直接提供密码extra-vars 优先级最高,彻底绕过 `/root` 的 password lookup。Linux 分支不变 |
## TC-MAC-018: postgres native 安装误用过期 Intel Homebrew 崩溃
| 项目 | 内容 |
|------|------|
| **触发文件** | `roles/vhosts/postgres/tasks/macos.yml` |
| **触发报错** | `Ensure PostgreSQL 16 is installed via Homebrew``/usr/local/Homebrew/.../macos_version.rb: unknown or unsupported macOS version: "27.0" (MacOSVersion::Error)` |
| **根因** | 该任务用 `community.general.homebrew` 模块,模块自行探测 brew 前缀,命中了机器上**过期的 Intel Homebrew**`/usr/local/Homebrew`),其内置 macOS 版本表不认识 `27.0`brew 启动即崩溃。而 vault/openclaw 用 `command: brew`(走 PATH 上可用的 brew如 Apple Silicon 的 `/opt/homebrew`)则正常——这是模块选错 brew而非 brew 整体不可用 |
| **修复方案** | 与 vault/openclaw 对齐:改用 `ansible.builtin.command: brew install postgresql@16`,并在 `environment.PATH` 前置 `/opt/homebrew/bin:/usr/local/bin`(优先选可用的 brew`HOMEBREW_NO_AUTO_UPDATE=1``register`+`changed_when`/`failed_when` 维持幂等。真实仓库 `macos.yml` 已改clone 路径由 `patch_playbook_postgres_macos()` 同步补丁 |
| **备注** | 若该机仅有一个且过期的 brew纯 Intel根因为环境`brew update`/重装 Homebrew本修复在“存在可用 brew”时即可绕过vault 步骤已证明存在可用 brew |
---
## 修复维度总结

View File

@ -187,3 +187,21 @@ PUT /v1/identity/mfa/method/totp/admin-generate
**修复**:脚本 Darwin 分支注入 `-e postgresql_deploy_mode=native` + `append_secret_var postgresql_admin_password=$UNIFIED_AUTH_TOKEN`(直接给密码,绕过 `/root` lookup。纯脚本改动Linux 不变。`bash -n` 通过,`append_secret_var` 在用前已定义。
**后续观察**native 路径 `macos.yml` 使用 `community.general.homebrew` 模块,若该 collection 未安装可能是下一个点;先验证本步。
---
## 13. 续postgres native 安装 Homebrew 崩溃TC-MAC-01820:50
**进展**native 模式生效postgres 进入 `macos.yml`)。新报错:
```
/usr/local/Homebrew/.../macos_version.rb: unknown or unsupported macOS version: "27.0"
```
**根因(非 brew 整体不可用)**`community.general.homebrew` 模块自探测到过期的 **Intel Homebrew**`/usr/local/Homebrew`),其不认识 macOS 27.0 而启动崩溃vault/openclaw 用 `command: brew`(走 PATH 上可用的 brew均正常——是模块选错了 brew。
**修复**postgres `macos.yml` 安装改为 `command: brew install postgresql@16` + `environment.PATH` 前置 `/opt/homebrew/bin:/usr/local/bin` + `HOMEBREW_NO_AUTO_UPDATE=1`,与 vault/openclaw 一致。真实仓库已改clone 路径新增 `patch_playbook_postgres_macos()` 同步补丁。
**验证**:脚本 `bash -n` 通过;用 git HEAD pristine `macos.yml` 跑补丁,模块被替换为 command:brew、YAML 合法、二次执行幂等。
**注意**:若该机仅有单一过期 brew纯 Intel属环境问题`brew update` 或重装 Homebrew。

View File

@ -1322,6 +1322,43 @@ path.write_text(text)
PY
}
# The postgres native (macOS) path installs postgresql@16 via the
# community.general.homebrew module, which auto-detects a brew prefix and can
# pick a stale Intel Homebrew at /usr/local that crashes on newer macOS versions
# ("unknown or unsupported macOS version"). Replace it with a brew command that
# runs the brew on PATH (Apple Silicon prefix first), matching vault/openclaw.
patch_playbook_postgres_macos() {
local macos_file="roles/vhosts/postgres/tasks/macos.yml"
[ -f "$macos_file" ] || return 0
python3 - <<'PY'
from pathlib import Path
path = Path("roles/vhosts/postgres/tasks/macos.yml")
text = path.read_text()
old = (
"- name: Ensure PostgreSQL 16 is installed via Homebrew\n"
" community.general.homebrew:\n"
" name: postgresql@16\n"
" state: present\n"
)
new = (
"- name: Ensure PostgreSQL 16 is installed via Homebrew\n"
" ansible.builtin.command: brew install postgresql@16\n"
" environment:\n"
" PATH: \"/opt/homebrew/bin:/usr/local/bin:{{ ansible_env.PATH }}\"\n"
" HOMEBREW_NO_AUTO_UPDATE: \"1\"\n"
" register: postgresql_brew_install\n"
" changed_when: >-\n"
" 'already installed' not in (postgresql_brew_install.stderr | default(''))\n"
" and 'already installed' not in (postgresql_brew_install.stdout | default(''))\n"
" failed_when: postgresql_brew_install.rc != 0\n"
)
if old in text:
text = text.replace(old, new, 1)
path.write_text(text)
PY
}
ensure_core_skills_source() {
if [ "${AI_WORKSPACE_PREFETCH_COMPLETED:-false}" = "true" ] &&
[ -d "$XWORKSPACE_CORE_SKILLS_DIR/skills" ]; then
@ -2104,6 +2141,7 @@ patch_playbook_user_systemd
if [ "$(detect_os)" = "darwin" ]; then
patch_playbook_vault_macos
patch_playbook_common_macos
patch_playbook_postgres_macos
fi
prefetch_independent_sources
ensure_core_skills_source