Ansible 控制端與 inventory 設計
控制端與構建網段分離,經跳板或 mesh 內網連 Mac 池;inventory 用靜態群組+標籤(角色、是否互動),勿把密碼與長效金鑰同檔。
- 身分耦合:共用單一私鑰難分段稽核。
- 群組過粗:互動與純 CI 同 play 易踩檔案鎖。
- 隱性成本:
ansible_user/become 未約定致 sudo 互動或過寬 NOPASSWD。
Runbook 五步:拆群組;定 ansible_ssh_private_key_file/ansible_ssh_common_args;vault 存密;明確 ansible_python_interpreter;審核「誰能跑哪組」。延伸構建佇列與 flock FAQ。
ssh_args 與憑證輪換步驟表
OpenSSH 8.2+可用 -o CertificateFile=...;金鑰路徑放 [ssh_connection],單群組用 ansible_ssh_extra_args。下表假設已有 CA。
| 步驟 | 動作 | 檢查點/回滾 |
|---|---|---|
| 1 | 簽新憑證,控制端並存新路徑 | ssh -i 手測;舊憑證仍可用 |
| 2 | 更新 group_vars 的 Identity/Certificate | 單臺 ping;失敗還原 |
| 3 | --check+標籤子集 |
diff 僅預期檔;勿觸發 handler |
| 4 | serial 灰度,看載入與 sshd 日誌 |
單批失敗即停 |
| 5 | 撤舊 CA/公鑰,留稽核 | 全 ping+抽樣登入 |
可引用:憑證 TTL 常 24~72h;輪換留一個重疊世代金鑰並存。
forks/serial 與節點穩定性閾值
forks=同時 SSH 數;共享 Mac 上過高會與 Xcode、模擬器爭用。依角色與在線人數下修;會重啟服務或大寫入的 play 用 serial。
| 節點型態 | forks 起點 | serial/備註 |
|---|---|---|
| 純 CI | 每機3~6 | 動 sshd/防火牆:serial:1 或 25% |
| 互動+構建 | 2~4 | 重 play 與 ping 分開跑 |
| 多租戶共享池 | 1~2 | 加 throttle |
冪等 play 決策矩陣(摘錄):
| 變更類型 | 建議策略 | 避免事項 |
|---|---|---|
| 設定檔 | template+mode;可 validate |
勿無意改 mtime 連鎖 handler |
| 套件/工具鏈 | 鎖版本;serial 分批 |
忌全池同時 brew/大編譯 |
| 服務/守護 | 單一 handler;先 check | 忌多處 killall |
可引用:timeout 30~60s;pipelining=True 前確認未 requiretty 擋 become。
可執行 ansible.cfg 片段(請替換路徑)
[defaults]
inventory = ./inventory
forks = 4
timeout = 45
host_key_checking = True
interpreter_python = auto_silent
retry_files_enabled = False
[ssh_connection]
pipelining = True
ssh_args = -o ControlMaster=auto -o ControlPersist=300s \
-o IdentityFile=~/.ssh/id_ed25519_ansible \
-o CertificateFile=~/.ssh/id_ed25519_ansible-cert.pub
憑證僅部分群組時,把 CertificateFile 放該群組 ansible_ssh_common_args。
與共享構建機的衝突規避
與 CI 爭用 DerivedData、codesign 鑰匙圈、套件快取。請維護視窗錯峰;長編譯 play 加互斥標籤並看佇列;用 facts/KV 維護旗標暫停非急件。可引用:同節點大型變更同時≤1;輕量任務可並行但 forks 保守。
FAQ
問:forks 很大?
答:SSH/sudo 爆量搶鎖;依表下修,必要 throttle。
問:輪換怕半數斷線?
答:新舊並存→check→serial→撤舊 CA;留回滾路徑。
問:何者必冪等?
答:sshd、防火牆、LaunchDaemon、大樹變更;handler 收斂重啟。
延伸閱讀見站內其他維運主題。