IDC 自動開通是怎麼實現的:從下單到交付的完整流程
IDC 自動開通的核心是一台訂單狀態機:付款事件觸發庫存匹配,然後按固定順序執行 IP 分配、交換器連接埠配置、透過 IPMI 設定 PXE 啟動並重灌系統,最後把 IP 和密碼回填給客戶。每一步都要能判斷成功與否,失敗時沿原路釋放資源,機器才不會卡在“半開通”狀態。
自動開通是一條固定順序的流水線
IDC 自動開通(也叫伺服器自動開通、自動化交付)解決的問題只有一個:客戶付款後,不需要任何人登入後台,機器就能裝好系統、配好網路、把登入資訊送到客戶手裡。實現方式是把交付拆成固定順序的步驟,每一步有明確的輸入、輸出和成功判斷,由一台訂單狀態機驅動著往下走。
以獨立伺服器為例,一筆訂單從付款到交付要經過這些步驟:
| 步驟 | 輸入 | 輸出 | 由誰執行 | 怎麼判斷成功 |
|---|---|---|---|---|
| 1. 付款確認 | 支付閘道器回呼 | 訂單狀態變為“已支付” | 財務系統 | 回呼簽名校驗透過,金額與訂單一致 |
| 2. 庫存匹配 | 套餐(機房、線路、CPU、記憶體、硬碟) | 一台被預佔的空閒伺服器 | 機房管理系統 | 查到滿足條件且 BMC 可達的機器並鎖定 |
| 3. IP 分配 | 機房、線路、IP 數量 | 主 IP、閘道器、掩碼、DNS,可選附加 IP 與 IPv6 段 | IP 位址管理模組 | 從位址段取到未佔用、未鎖定的位址並標記佔用 |
| 4. 交換器連接埠配置 | 伺服器所接連接埠、VLAN、頻寬 | 連接埠開啟、VLAN 正確、限速生效 | 交換器管理模組 | 命令下發後回讀連接埠狀態一致 |
| 5. 裝系統 | 映象、分割槽方案、root 密碼、網路引數 | 可登入的作業系統 | 裝機服務 + BMC | 收到裝機完成回呼,SSH 或 RDP 連接埠可連 |
| 6. 帳號下發 | IP、密碼、主機名 | 客戶收到交付資訊,自助端能看到機器 | 財務系統 | 回填成功,通知傳送成功 |
| 7. 收尾 | 實際 MAC、連接埠 | ARP 繫結完成,流量計費開始 | 交換器與計費模組 | 繫結成功,流量池開始計數 |
每一步失敗都要有對應的回退動作,否則機器會卡在“IP 分了但系統沒裝”“連接埠開了但沒人用”的中間態。本文後半部分專門講回退怎麼設計。
雲主機的流程有什麼不同
雲主機的開通不涉及 BMC 和交換器連接埠,流程短得多:財務系統呼叫虛擬化平台的 API,從範本克隆磁碟,建立虛擬網路卡並掛到對應的網橋或 VLAN,把 IP、密碼、SSH 公鑰透過 cloud-init 的後設資料注入,啟動後幾十秒內即可登入。
差別主要在三點:
| 維度 | 獨立伺服器 | 雲主機 |
|---|---|---|
| 庫存 | 一台物理機對應一筆訂單,匹配靠硬體條件 | 看宿主機剩餘 CPU、記憶體、儲存,由排程器選宿主 |
| 網路 | 真實交換器連接埠,要下發 VLAN 和限速 | 虛擬網路卡,安全組或流表控制,限速在宿主機上做 |
| 失敗處理 | 要逐步回退,機器可能需要人工檢查 | 直接銷燬重建,代價很低 |
正因為雲主機失敗重建的代價低,很多團隊把獨立伺服器的交付也往這個方向靠:裝機前自動清盤、自動重置 BMC,讓“重跑一次”儘可能可靠。
訂單狀態機:狀態、事件與冪等
狀態機是自動開通的骨架。訂單隻能處於有限的幾個狀態,只有特定事件能觸發狀態變化,每次變化伴隨固定動作:
| 當前狀態 | 事件 | 下一狀態 | 觸發的動作 |
|---|---|---|---|
| 待支付 | 支付成功回呼 | 已支付 | 建立開通任務 |
| 已支付 | 開通任務開始 | 開通中 | 庫存匹配、IP、連接埠、裝機 |
| 開通中 | 全部步驟成功 | 使用中 | 回填資訊、通知客戶、開始計費週期 |
| 開通中 | 某步驟失敗且重試用盡 | 開通失敗 | 執行補償動作,告警給維運 |
| 使用中 | 帳單逾期 | 已暫停 | 關閉交換器連接埠或關機 |
| 已暫停 | 續費成功 | 使用中 | 恢復連接埠、開機 |
| 使用中 / 已暫停 | 退訂或到期未續 | 已釋放 | 解綁伺服器、回收 IP、連接埠回到隔離 VLAN |
兩條工程上的硬規則:
- 事件必須冪等。支付閘道器的回呼可能重複到達,用訂單號做唯一鍵,第二次回呼直接返回成功而不重複建立任務。裝機完成回呼同理。
- 狀態變化先落庫再執行動作。先把訂單置為“開通中”並寫入任務記錄,再去碰 BMC 和交換器。程序中途崩潰後,重啟的工作程序能從任務記錄裡知道做到了哪一步。
庫存匹配:怎麼找到合適的空閒機器
套餐定義的是一組條件:機房、線路、CPU 型號或核數、記憶體容量、硬碟數量與型別、頻寬、IP 數量。匹配時按條件篩選,再加三條過濾:
- 伺服器狀態為“空閒”,且沒有被其他正在執行的訂單預佔;
- BMC 位址可達,最近一次電源狀態查詢成功;
- 硬體自動採集的結果與套餐一致。人工錄入的配置和實際硬體對不上,是交付後客戶投訴“配置不符”的主要來源。
併發是這一步的難點:兩筆訂單同時付款,不能分到同一台機器。常見做法是在資料庫裡用行鎖完成“查詢並預佔”:
BEGIN;
SELECT id FROM servers
WHERE datacenter_id = 3 AND plan_id = 17 AND status = 'idle'
ORDER BY id LIMIT 1
FOR UPDATE SKIP LOCKED;
-- 假設上一條查詢返回的 id 是 1024
UPDATE servers SET status = 'reserved', order_id = 'ORD-20261003-0001' WHERE id = 1024;
COMMIT;
FOR UPDATE SKIP LOCKED 讓併發的事務跳過已被鎖住的行,各自拿到不同的機器。沒有空閒機器時,訂單停在“已支付”並通知維運補貨,而不是報錯給客戶。
網路準備:IP 分配與交換器連接埠
IP 分配
位址段要預先按機房、線路、型別(公網、IPMI、內網)登記,並標記哪些段參與自動分配、哪些段鎖定保留。分配時從匹配機房和線路的可用段裡取第一個空閒位址,同時記錄該段的閘道器、掩碼和 DNS,這些引數後面會寫進裝機應答檔案。附加 IP 和 IPv6 子段按套餐數量一併取出。
分配動作同樣要冪等:以訂單號為鍵記錄“這筆訂單已分到哪些位址”,重試時直接複用,不會一次失敗多佔幾個 IP。取址之前做一次 ARP 或 ping 探測,有回應說明位址被殘留配置佔著,跳過它並標記衝突。
交換器連接埠
伺服器接在哪台交換器的哪個連接埠,是上架時登記的。開通時要下發三類配置:VLAN、速率上限、連接埠開啟。裝機階段還有一個 DHCP 的問題:PXE 需要 DHCP,而生產 VLAN 裡通常不放 DHCP 服務。兩種常見設計:
| 設計 | 做法 | 優點 | 代價 |
|---|---|---|---|
| 裝機 VLAN 切換 | 開通時連接埠先切到裝機 VLAN(內有 DHCP、TFTP 和 HTTP 映象源),裝完切回業務 VLAN | 生產網裡不需要 DHCP,映象源隔離 | 多一次 VLAN 切換,裝機完成的判斷必須準確 |
| 業務 VLAN 內中繼 | 業務 VLAN 上配置 DHCP 中繼到裝機伺服器,應答檔案裡寫靜態 IP | 連接埠配置一次到位 | DHCP 服務暴露在客戶網段,要按 MAC 嚴格限制應答 |
以華為 S 系列為例,把連接埠放進 VLAN 100、雙向限速 100 Mbps(cir 的單位是 kbit/s)並開啟連接埠的配置如下。部分型號的入方向不支援 qos lr,要改用 qos car,以型號手冊為準;思科裝置用 switchport access vlan 100 配置 VLAN,限速透過 policy-map 實現:
interface GigabitEthernet0/0/12
port link-type access
port default vlan 100
qos lr inbound cir 100000
qos lr outbound cir 100000
undo shutdown
下發後要回讀確認:display interface GigabitEthernet0/0/12 看連接埠狀態,display port vlan GigabitEthernet0/0/12 看 VLAN,與期望一致再進入裝機。只發不讀,是“連接埠配置成功了但機器不通網”的常見原因。
裝系統與帳號下發:IPMI、PXE 與應答檔案
設啟動項並從 PXE 引導
獨立伺服器的裝機依賴 BMC:先把下一次啟動設為 PXE,再重啟。用 ipmitool 表達就是兩條命令:
# 設定下一次啟動從 PXE(UEFI 機器加 options=efiboot)
ipmitool -I lanplus -H 10.20.0.15 -U admin -P '密碼' chassis bootdev pxe options=efiboot
# 斷電重啟,伺服器會從 PXE 啟動
ipmitool -I lanplus -H 10.20.0.15 -U admin -P '密碼' chassis power cycle
PXE 側由 DHCP 告訴網路卡去哪裡取載入程式。dnsmasq 的典型配置是按客戶端架構區分 BIOS 和 UEFI 引導檔案:
# /etc/dnsmasq.d/pxe.conf
dhcp-range=10.30.0.100,10.30.0.200,255.255.255.0,10m
# 客戶端架構 7(EFI BC)和 9(EFI x86-64)都按 UEFI 處理
dhcp-match=set:efi,option:client-arch,7
dhcp-match=set:efi,option:client-arch,9
dhcp-boot=tag:efi,grubx64.efi
dhcp-boot=tag:!efi,pxelinux.0
enable-tftp
tftp-root=/srv/tftp
應答檔案與完成判斷
應答檔案決定裝機能否無人值守:RHEL 系用 Kickstart,Debian 用 preseed,Ubuntu 用 autoinstall,Windows 用 autounattend.xml。應答檔案由開通流程按訂單動態生成,把前面分配的 IP、閘道器、DNS、主機名和密碼寫進去,並在安裝結束時回呼開通服務:
# kickstart 片段(按訂單生成)
network --bootproto=static --device=link --ip=103.45.12.37 --netmask=255.255.255.0 --gateway=103.45.12.1 --nameserver=103.45.0.53 --hostname=srv-0001
# 密碼只寫 SHA-512 雜湊,不寫明文
rootpw --iscrypted $6$<salt>$<hash>
# --nochroot:在安裝環境裡執行回呼,不依賴新系統是否裝了 curl
%post --nochroot
curl -fsS -X POST https://provision.example.com/callback/ORD-20261003-0001 -d status=installed
%end
裝機完成的判斷不要只靠一個訊號。穩妥的組合是:收到 %post 回呼,然後探測 SSH(Linux)或 RDP(Windows)連接埠可連,再用下發的密碼登入一次執行 hostname。三項都過,才把訂單推進到下一步。超過預設時限沒有回呼,就取一張 BMC 控制檯截圖,判斷是否卡在引導選單或磁碟錯誤,再決定重試還是轉人工。
另一種裝機路徑是透過 BMC 掛載 ISO(虛擬介質)並自動應答,適合沒有 PXE 環境的小機房;缺點是映象透過 BMC 網口傳輸,速度通常明顯低於 PXE 走業務網口。
帳號下發與收尾
系統裝好後,開通服務做四件事:
- 回填:把 IP、主機名、初始密碼寫回訂單,財務系統的會員中心據此顯示伺服器資訊;密碼只在交付時展示一次,之後由客戶自己修改。
- 通知:郵件或簡訊傳送交付資訊,內容不含明文密碼,讓客戶登入會員中心檢視。
- 繫結:從交換器學到伺服器網路卡的實際 MAC,做 ARP 繫結和源位址校驗,防止 IP 被冒用;裝機 VLAN 方案在這一步把連接埠切回業務 VLAN。
- 開始計量:把連接埠加入流量池,按套餐的頻寬或流量口徑開始計費;計費週期從交付成功的時間起算比從付款時間起算更合理,客戶不會為等待裝機的時間付費。
到這裡訂單進入“使用中”,之後的重啟、重灌、救援、改密碼由客戶在自助端完成,不再經過開通流程。
哪些環節容易失敗,怎麼設計回退
自動開通的難點不在正常路徑,而在失敗路徑。下表是獨立伺服器交付裡常見的故障點:
| 環節 | 典型失敗 | 怎麼發現 | 回退動作 |
|---|---|---|---|
| 庫存匹配 | 沒有空閒機器;機器狀態是空閒但 BMC 不通 | 查詢結果為空;電源狀態查詢超時 | 訂單停在“已支付”並通知補貨;BMC 不通的機器標記“待檢查”,移出空閒池 |
| IP 分配 | 位址段用盡;取到的位址實際線上 | 無可用位址;分配前探測有回應 | 換下一段;有回應的位址標記衝突並換一個 |
| 交換器配置 | SSH 登入失敗;命令在該型號上語法不同;回讀不一致 | 下發超時或回顯報錯 | 重試一次;仍失敗則連接埠置於隔離 VLAN 並關閉,釋放 IP,機器回“待檢查” |
| 裝機 | PXE 沒拿到 DHCP;映象源超時;磁碟有舊 RAID 後設資料;卡在引導選單 | 規定時間內無回呼;控制檯截圖 | 自動重試一次(先清磁碟後設資料),再失敗轉人工,保留 IP 和連接埠配置以便人工接手 |
| 回填通知 | 財務系統介面超時 | HTTP 返回非 2xx | 只重試回填,不重跑裝機 |
設計回退時遵守幾條原則:
- 補償動作按相反順序執行:裝機失敗先回收連接埠配置,再釋放 IP,再標記機器狀態。順序反了,會出現 IP 已釋放、連接埠還通著的視窗。
- 不要盲目把機器放回空閒池:裝機失敗的機器可能有硬體問題,放回去只會讓下一筆訂單再失敗一次。標記為“待檢查”,由人確認後再放回。
- 客戶拿到資訊之後不再自動回收:回填成功後發現某個後續步驟失敗(例如 ARP 繫結),只告警不回滾,否則客戶正在登入的機器會被收走。
- 每步設超時,但超時後先看現場:裝機耗時隨映象大小、網速和硬體自檢時間變化很大,超時後先取控制檯截圖判斷,而不是直接判定失敗。
- 多機房要有執行節點冗餘:裝機、採集這類任務由各機房的本地節點就近執行,某個節點離線時要能自動換節點,否則整個機房的開通都會停。
在管理系統裡怎麼落地
上面的流程需要財務系統和機房管理系統兩端配合。Toplink 的做法是:CloudFinance 用訂單狀態機驅動開通、暫停與釋放,付款後由專用配置模組把訂單同步到 DCIM;DCIM 按套餐定義的 CPU、記憶體、硬碟、IP、頻寬組合匹配空閒伺服器,從開啟了自動分配的位址段取 IP,按交換器廠商指令集下發連接埠配置,再透過 IPMI 重灌系統,可選映象覆蓋 CentOS、AlmaLinux、Rocky、Ubuntu、Debian、Windows、ESXi 等。各機房部署從節點就近執行重灌和採集,某個從節點不可用時自動挑選其他節點;重灌進度在任務佇列裡可見。細節見 計費與自動開通、IP 位址管理 和 IPMI 遠端管理。已經在用魔方財務、魔方 V10 或 WHMCS 的服務商,可以透過對接外掛走同一條鏈路:付款即開通、回填 IP 和密碼、逾期自動關機斷網、續費自動恢復、退訂自動解綁並釋放 IP。
常見問題
獨立伺服器自動開通一般需要多長時間?
付款到開始裝機通常只要幾十秒到幾分鐘,主要耗時在系統安裝本身,取決於映象大小、映象源是否在本機房以及伺服器自檢時間;Windows 通常比 Linux 慢。把映象源放在機房內網、提前清理磁碟上的舊 RAID 後設資料,能明顯縮短時間。
沒有 IPMI 的伺服器能自動開通嗎?
能裝機但做不到全自動:沒有帶外管理就無法遠端設定啟動項和重啟,失敗後也看不到螢幕,只能人工到機房處理。用於自動交付的機器應當都配 BMC 並接入管理網。
雲主機和獨立伺服器的自動開通有什麼區別?
雲主機由虛擬化平台的 API 克隆範本、cloud-init 注入網路和密碼,幾十秒完成,失敗直接銷燬重建;獨立伺服器要操作真實的 BMC、交換器和裝機流程,耗時長、失敗點多,回退時必須釋放 IP 和連接埠配置。
自動開通失敗時客戶會看到什麼?
合理的設計是訂單停在“開通中”並立即通知維運,而不是把報錯直接拋給客戶;超過預設時限仍未成功時轉人工處理,並告知客戶預計交付時間。