SSH
擷取自本部署其中一個 CE,時間為 2026-07-28。sitecli/capture-manifest.json
記錄了所在節點,scripts/capture-sitecli.sh --check 可對照線上 CE 重新驗證命令介面。
SSH 可連線至應用裝置的 admin 帳號,其登入 Shell 為 Site CLI
(/opt/bin/vpmu)。這是存取完整機上命令介面的唯一途徑——
debug API 提供 34 個命令,而應用裝置本身還提供許多該 API 完全未收錄的命令。
cd terraformSLI=$(terraform output -json ce_sli_private_ips | jq -r '.eastus01')ssh -tt -i ~/.ssh/id_ed25519 -J azureuser@<operator-vm> "admin@$SLI"該命令列的每個部分都不可或缺,接下來三節將分別說明各部分所預防的失敗情況。
連線後不會出現 Shell 提示字元:admin 的登入 Shell 就是 Site CLI,因此您將直接進入其 >>> 提示字元。在此處以 execcli <name> 執行機上命令——詳見機上命令。
為何由 cloud-init 寫入金鑰,而非透過 API
Section titled “為何由 cloud-init 寫入金鑰,而非透過 API”站台物件上的 admin_user_credentials.ssh_key 看起來正是用於此目的的欄位。它可被接受,讀回後也仍存在,但它不配置任何東西。vpm 擁有節點的本地使用者,並拒絕處理這個帳號——從節點自身的日誌中,在單次開機過程中出現了三次:
vpm users.go:165: Won't do any change for user admin (internal skip)一切後續問題都源於這一行。/var/home/admin/.ssh 在站台達到 ONLINE 前後均不存在。admin 的 shadow 最後變更日期停留在映像建立日期,而 vesbkp 和 vesopcon 則顯示當前日期,因為 vpm 設置了這兩者並跳過了 admin。且 vpm 在任何時候都未記錄關於 ssh_key 或 authorized_keys 的任何內容。
因此,必須在 vpm 之外寫入此檔案。admin 的 uid 為 2202,已內建於節點映像中,因此在 cloud-init 執行之前它就已存在,且 owner: admin:admin 在寫入時即可解析——無需 runcmd,無需事後修正擁有權:
- path: /var/home/admin/.ssh/authorized_keys permissions: "0600" owner: admin:admin content: | ${ssh_public_key}sshd 一直都願意配合。sshd -T 報告 pubkeyauthentication yes,且 admin 出現在節點上兩個 sshd_config 檔案的 AllowUsers 中。從來不需要啟用任何東西——只是缺少一個檔案。
為何它只在一個位址上回應
Section titled “為何它只在一個位址上回應”sshd 綁定 0.0.0.0:22,但只有**內部(SLI)**位址是以 sshd 會回應的方式存在於主機網路堆疊中。eth0 被重新命名為 a-i-eth0,且完全不攜帶主機 IP——Argo 資料平面擁有該介面,而原本應在其上的管理/SLO 位址改由 vhost0 承載。其他兩個 NIC 則以各自的名稱保留在主機堆疊中。
從 VNet 內的虛擬機器對一個 CE 進行探測:
management/SLO address timed outexternal address timed outinternal/SLI address OPEN SSH-2.0-OpenSSH_8.7an unused address timed out (control)因此,對您所知的節點位址進行探測,其返回結果與封閉的安全群組完全相同。沒有任何東西阻擋它;只是那個位址上沒有監聽器。
CE 的公開位址在連接埠 22 上也沒有監聽器,這就是上述命令透過 -J 連線的原因:一個位於 VNet 內部、與 SLI 位址同子網路的操作者虛擬機器。本部署為此專門建置了一個——terraform output -raw client_vm_name 可查看其名稱。
Site CLI 需要終端機以及歸位字元(Carriage Return)
Section titled “Site CLI 需要終端機以及歸位字元(Carriage Return)”admin 的登入 Shell 不是一般的 Shell。它是一個 go-prompt 應用程式,會將終端機切換至原始模式並讀取按鍵而非整行輸入。這帶來四個後果,每一個的失敗方式看起來都像是不同的問題:
| 機制 | 缺少時的情況 |
|---|---|
配置終端機(ssh -tt) | go-prompt.NewStandardInputParser 觸發 panic: no such device or address,看起來像是應用裝置崩潰 |
| 按下 Enter 時傳送歸位字元而非換行字元 | 該行永遠不會被提交,工作階段在輸入結束時關閉且未印出任何內容 |
| 保持標準輸入開啟 | 命令完成渲染之前連線已結束,因此正常運作的命令看起來沒有任何輸出 |
| 分別傳送命令文字與 Enter 位元組 | 換行字元作為字面字元落入緩衝區,CLI 回應 unknown command,看起來像是命令不存在 |
因此,ssh host 'some-command' 無法使用:參數會被忽略,互動式提示字元照常啟動。必須以終端機方式驅動,否則完全無法使用。scripts/sitecli_ssh_harvest.py 是參考實作。
登入橫幅是一次免費的健康檢查
Section titled “登入橫幅是一次免費的健康檢查”在您輸入任何內容之前,登入橫幅已經回答了幾個您原本需要花費命令才能查明的問題。來自 f5-xc-ce-vm-01,ASCII 藝術字與公開 IP 已省略:
UNAUTHORIZED ACCESS TO THIS DEVICE IS PROHIBITEDAll actions performed on this device are audited
Using https://register.ves.volterra.ioOS: rhel-9.2024.6Memory: 32768MiBStorage: sda: 31GiBCPU: Model: Intel(R) Xeon(R) Platinum 8272CL CPU @ 2.60GHz | CPUs: 8Software: crt-20250613-3382DNS: 168.63.129.16: OKNTP: SyncedUptime: 0 days, 5 hours, 20 minutesRegistration Status: PROVISIONEDSLO IP: 10.0.1.4/26WELCOME IN SITE CLIRegistration Status 可區分仍在啟動中的節點(PROVISIONING)和已完成的節點(PROVISIONED)。Software 是決定哪些命令存在的建置字串。DNS 和 NTP 涵蓋了最先導致註冊失敗的兩個相依項目,因此從未上線的節點通常在這裡就已告知原因——在需要 chronyc-sources 或 dig 之前。
-
如果您尚未擁有金鑰對,請產生一個。使用 Ed25519 而非 RSA:更短,且被應用裝置
sshd所接受。Terminal window ssh-keygen -t ed25519 -C "ce-operator" -f ~/.ssh/id_ed25519 -
將公鑰指向部署。根模組讀取檔案一次,並將字串傳遞至每個節點:
terraform/terraform.tfvars ssh_public_key_path = "~/.ssh/id_ed25519.pub"ssh_public_key改為直接接受內容字串,這是計畫測試所使用的方式。私鑰永遠不會離開您的工作站。 -
套用。在套用之前請先閱讀本頁頂部的警告——在現有部署上,這將替換 CE 虛擬機器。
以下每項都曾在此途徑仍被認為不可能時進行過測試並排除。每一項都有足夠的可信度讓人花費一天時間。
| 非原因 | 排除方式 |
|---|---|
| 憑證僅在建立時套用 | sshd 在首次開機約 90 秒後啟動,此時站台物件尚不存在。admin_user_credentials 也存在於 ReplaceSpecType 中,並就地套用。 |
block_all_services | 無論服務是否被封鎖,管理位址上連接埠 22 的關閉情況完全相同。 |
| 金鑰末尾的換行字元 | 兩種方式均已測試,無變化。cloud-init 仍會將其去除,因為否則字面區塊會渲染出第二個空行。 |
| 已固定的舊版 CE 軟體 | 已在三個建置上重現,包括一個執行 OpenSSH 9.9 的建置。 |
缺少 admin_password | 在從頭建立的 CE 上同時設定 admin_password 和 ssh_key 並無任何改變。 |
ONLINE.