
機隊裡的 Ubuntu 伺服器有二十幾台,每一台建立好之後,做的事幾乎一模一樣:
設時區、開自動對時、裝虛擬機代理程式、關掉 IPv6、開密碼登入、裝順手的編輯器。
六件事,做一次十分鐘,做二十次就是三個多小時,而且每次都可能漏掉其中一項。
真正的代價不是那三個小時,是「二十台機器裡有三台跟其他人不一樣,而你不知道是哪三台」。
所以這件事只做一次,做成範本,之後全部用複製的。
範本的實體其實是兩個東西:一顆磁碟映像,加一份開機設定。
基底用官方的雲端映像,不用安裝光碟。安裝光碟需要人工設定;雲端映像預期你不會坐在螢幕前面回答問題,開機時它會去讀一份設定檔,把主機名稱、使用者、套件、要跑的指令全部照做完。
複製一台新機器只要一行指令,開機起來就是設定好的狀態,不必登入去補任何東西。
但雲端映像有三個預設值會讓你以為東西壞了:
第一,它預設關閉密碼登入。不打開,你複製出來的機器登不進去。
第二,它的套件索引是空的。不先更新一次,任何要裝的套件都會裝不到。
第三,它沒有附虛擬機代理程式。沒有它,主機端看不到這台機器的 IP,也沒辦法優雅關機。
這三個都要寫進開機設定,不是登入之後再補。
ssh 連到 proxmox,切換到 /opt/claude-working,執行 claude code:
告訴它:
我要做一個 Ubuntu 伺服器範本,之後所有新機器都從它複製。
環境:
- Proxmox 上,內網 192.168.0.0/24,路由器是 192.168.0.10
請幫我:
1. 抓官方的 Ubuntu 24.04 雲端映像,把它的雜湊值記下來寫進說明檔。
2. 匯入成支援快速複製的磁碟格式,不要用預設那種。
3. 開機設定要一次做完這些,不要留給我登入後再補:
- 時區 Asia/Taipei,開啟自動對時
- 建一個使用者 admin,密碼 admin,可以免密碼 sudo(測試用,上線前我會換掉)
- 打開密碼登入
- 先更新套件索引,再裝 qemu-guest-agent、nano、tmux
- 關掉 IPv6,而且要連網卡上那個本地位址都不存在
4. 網卡的防火牆選項在範本上就關掉,不要留給每台複製出來的機器各關一次。
5. 存成範本,名字叫 ubuntu-base。
規則:
- 整件事你做完,不要把步驟列給我叫我自己去點。
- 主機名稱要跟著虛擬機名稱走 —— 我複製時給什麼名字,那台開機起來的主機名稱
就要是什麼,不可以每台都一樣。
- 開機設定裡任何一行,你都要先想過「它失敗會不會拖垮整份」再寫。
- 做完把你改過的每個檔案和參數列出來。
開機設定如果自己指定,有一個陷阱要小心:
如果你把整包使用者設定換成自己的,主機端原本會幫你「把主機名稱設成虛擬機名稱」那段就沒了,
結果是每一台複製出來的機器,主機名稱都叫同一個預設值。
二十台機器同名,你連 SSH 連到哪一台都分不出來。
正確做法是:使用者和密碼用主機端的參數指定,自己的設定只補在另一份「廠商設定」裡,
不要動到那包會產生主機名稱的。
還有一個回傳值害整包失敗的案例:
有一步是把虛擬機代理程式設成開機啟動。
問題是那個服務的定義檔沒有寫「開機啟動」這一段,所以那行指令一定回傳失敗,
而開機設定只要有任何一步失敗,整份就會被標記成錯誤 ——
後面的設定看起來都做了,狀態卻是紅的,你會花很久去找哪裡壞掉。
解法是直接啟動它,並且在後面加上「就算失敗也當作成功」。
開機設定裡任何一行都要想過:它失敗會不會拖垮整份?
還有兩處細節容易踩雷:
關 IPv6 要關到底。範本裡把 IPv6 關掉,寫的是系統參數檔。
它會關掉全域和預設,但網卡上那個自己長出來的本地位址還在。
要整個不載入,得改開機參數 —— 這裡有第二個陷阱:
雲端映像自己帶了一份設定,會把其中一個變數整包覆寫掉。
你寫進被覆寫的那一個,重開機後不但沒生效,連原本的設定也一起不見。
兩個變數長得很像,只差一個字。
還有一格勾勾,範本自己也中招:網卡的防火牆選項是開著的,而它會擋掉自動取得位址。
結果是每一台複製出來的機器都要手動再關一次。
這種東西要改在範本上,不是每次複製後補救 —— 改範本一次,省掉之後每一台。
再來是磁碟的設定:把映像匯入主機時,新版預設會是不支援快速複製的格式。
要改成另一種格式,複製出來的機器可以共用底層映像,只記錄差異。
實際數字:那顆範本磁碟名義上三十六 GB,實際只佔一點八 GB。
匯入時少加一個參數,這個好處就沒了,而且事後改要重來一次。
(說人話:磁碟設定要勾 Discard.)
最後:
上游會變。官方雲端映像的「最新版」網址是滾動更新的,今天抓的和下個月抓的不是同一份。
所以下載當下要把雜湊值記下來,寫進文件。
不然哪天要重建範本,你會得到一顆「差不多但不一樣」的底圖,
而那些差異會在最不該出事的時候冒出來。
安裝好了之後,
告訴 claude code:測試:
範本做好了,複製一台出來驗收,名字 test-01,固定位址 192.168.0.50。
每一項都要有證據,不要用「應該有」回報我:
1. 主機名稱是不是 test-01,不是預設值。
2. 用 admin / admin 密碼登入進得去嗎,sudo 是不是免密碼。
3. 時區、自動對時、qemu-guest-agent、tmux 是不是都好了。
4. IPv6 真的關掉了嗎 —— 連網卡上那個本地位址也要沒有。
5. 開機設定的最終狀態是不是成功,有沒有哪一步是紅的。
⛔ 不要用那個會印出開機設定的指令當證據。
它印的是主機端自動產生的版本,不包含我另外掛上去的那一份。
請登入進去看實際結果。
驗完把這台刪掉。
驗證的時候要注意:
有一個指令可以印出開機設定,看起來就是驗證用的 ——
但它印的是主機端自動產生的版本,不是你另外掛上去的設定。
拿它來確認「我的設定有沒有進去」,你會得到一個很有說服力的錯誤答案。
要真的確認,只能去複製一台出來,登入進去看結果。
驗證要看結果,不要看那個號稱會顯示設定的指令。
驗證完畢後,建第一台工作機:
告訴 claude code:
從範本複製第一台正式機器:名字 hq,固定位址 192.168.0.20。
這台是總管,之後我要在上面管整個機隊。
除了範本已經有的,這台還要:
1. 裝 Claude Code,並且把它的路徑加進 PATH,新開的 shell 要找得到。
2. 建一個 /opt/claude-working 當工作目錄,擁有者是 admin。
3. SSH 從 22 改成 22022,改完要確認它真的綁上去了,
不要只看設定檔寫了什麼。
最後這一項最重要:
4. 把這台的連線資訊寫進 Proxmox 那台虛擬機的備註欄,內容至少要有
主機名稱、IP、SSH 埠、登入帳號。
同一份也寫一次到 /opt/claude-working/hq.md。
然後在回報裡把這幾項再列一次給我看。
一樣的規則:你做完,每一項自己驗證過再回報。
Claude Code 第一次要人工登入認證,那一步留給我,其餘你做完。
這裡的:固定位址 及 SSH 從 22 改成 22022,可以改成你要的數字。
會要跑一會兒,然後,你的第一台 ubutnu server 就建好了。
主機名稱會跟著虛擬機名稱走,這個會自動;但網路位址如果用自動取得(dhcp),在一個有雜訊的網路裡可能會撞到別人。建議給固定位址比較穩。
另外,自訂連接埠的 SSH 在新版 Ubuntu 上不是改一個檔就好 —— 它預設由系統的通訊端服務接管,你得先把那個關掉、改用傳統服務,而且要重啟才會真的綁上新的埠。
範本的價值不在省下開機那十分鐘。
在於二十台機器從第一天起就長得一模一樣 ——
你在其中一台驗證過的事情,可以直接相信在其他十九台也成立。
一致性不是潔癖,它是你敢不敢一次改二十台的前提。
明天,讓每一個服務都能對外 —— 反向代理,還有不必手動續的憑證。