Tổng quan
Trong quá trình quản trị hệ thống sử dụng Proxmox VE (PVE) cluster kết hợp với Ceph storage, việc đảm bảo các node có thể xác thực SSH với nhau là một yếu tố then chốt để duy trì hoạt động ổn định của cluster. Tuy nhiên, trong một tình huống không mong muốn, tôi đã vô tình xóa toàn bộ thư mục ~/.ssh/
trong khi chạy Ansible từ 1 node trong cluster.
Hậu quả là:
- Không thể sử dụng VNC từ node này để mở VM trên node khác
- Một số thao tác giữa các node gặp lỗi xác thực
- Cluster hoạt động không ổn định do SSH trust bị mất
Qua bài viết này, tôi chia sẻ lại quá trình phân tích, khôi phục và những lưu ý quan trọng để tránh mắc phải lỗi tương tự – đồng thời giúp người quản trị hiểu sâu hơn về cơ chế xác thực nội bộ của PVE & Ceph.
1. Cơ chế xác thực nội bộ trong Proxmox VE và Ceph
🔑 1.1 Proxmox VE (PVE Cluster)
Proxmox sử dụng SSH để giao tiếp giữa các node trong cluster, bao gồm:
- Quản lý tài nguyên
- Di chuyển VM (migrate)
- Truy cập VNC giữa các node
🗂 Các thư mục liên quan đến xác thực:
/root/.ssh/ → SSH key cá nhân (dùng bởi người dùng root)
/etc/pve/priv/authorized_keys → Danh sách SSH public key tin cậy trong PVE cluster
/etc/pve/priv/ → Private keys và file config cluster
✅ PVE khi khởi tạo cluster sẽ tự động trao đổi SSH key và đưa vào /etc/pve/priv/authorized_keys
để các node có thể điều khiển nhau mà không cần mật khẩu.
💡 Quan trọng: Việc xóa ~/.ssh
không trực tiếp làm cluster lỗi, nhưng nếu bạn dùng ansible
và thao tác gì đó ghi đè hoặc thay thế authorized_keys
, thì cluster sẽ bị mất trust.
🧩 1.2 Ceph trong Proxmox
Ceph hoạt động nội bộ bằng cephx (cơ chế xác thực riêng), không phụ thuộc SSH để vận hành daemon.
🗂 Các file xác thực Ceph:
/etc/ceph/ceph.client.admin.keyring → Key quản trị
/etc/ceph/ceph.conf → Cấu hình cluster
/var/lib/ceph/{mon,osd,...} → Dữ liệu và key riêng của từng dịch vụ
Tuy nhiên, nếu bạn dùng ceph-deploy
, ceph orch
, hay ansible
để triển khai, thì SSH sẽ cần thiết cho quá trình truyền file và lệnh giữa các node.
2. Tình huống thực tế:
Xóa nhầm ~/.ssh
Sau khi xóa toàn bộ ~/.ssh/
bằng dòng lệnh:
rm -f ~/.ssh/id_rsa ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
Tôi đã cố gắng tạo lại SSH key mới và dùng ssh-copy-id
để thiết lập lại xác thực:
ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa
h(){
ssh-copy-id -o StrictHostKeyChecking=no root@192.168.100.201
ssh-copy-id -o StrictHostKeyChecking=no root@192.168.100.202
ssh-copy-id -o StrictHostKeyChecking=no root@192.168.100.203
ssh-copy-id -o StrictHostKeyChecking=no root@192.168.100.204
ssh-copy-id -o StrictHostKeyChecking=no root@192.168.100.205
}; h
Mặc dù lệnh thực thi thành công, nhưng cluster vẫn chưa hoạt động ổn định. Lý do: các node khác vẫn không có public key của node vừa sửa và /etc/pve/priv/authorized_keys
cũng có thể đã bị mất thông tin.
3. Giải pháp khôi phục đúng cách
✅ Bước 1: Tạo lại SSH key
ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa
✅ Bước 2: Đồng bộ SSH key đến tất cả node
Thực hiện từ từng node:
for host in 192.168.100.201 192.168.100.202 192.168.100.203 192.168.100.204 192.168.100.205; do
ssh-copy-id -o StrictHostKeyChecking=no root@$host
done
🔄 Lặp lại quá trình này từ mọi node để thiết lập full mesh SSH trust.
✅ Bước 3: Kiểm tra trust nội bộ PVE
Kiểm tra file:
cat /etc/pve/priv/authorized_keys
Nếu thiếu key nào → thêm thủ công hoặc dùng:
pvecm updatecerts --force
systemctl restart pve-cluster
🔍 Sơ đồ xác thực giữa các node (ASCII)
+------------+ +------------+
| Node A | <---> | Node B |
+------------+ +------------+
| |
+--> SSH Trust |
| |
+------------>----------+
Full Mesh:
[Node A] <--> [Node B] <--> [Node C] <--> [Node D] <--> [Node E]
^ |
+---------------------------------------------------+
⚖️ Ưu điểm & Nhược điểm của phương pháp thủ công
Ưu điểm | Nhược điểm |
---|---|
Chủ động kiểm soát | Tốn công sức khi số lượng node lớn |
Không phụ thuộc script ngoài | Dễ sai sót nếu thiếu node |
Hiểu sâu về cơ chế hoạt động | Có thể gây lỗi nếu sửa sai file /etc/pve/... |
🧠 Lời khuyên quản trị viên
- Không xóa
~/.ssh/
khi dùng Ansible hoặc bất kỳ tool tự động hóa nào – hãy backup trước! - Thiết lập full-mesh SSH trust trong PVE cluster là bắt buộc.
- Với Ceph, xác thực nội bộ không dùng SSH, nhưng bạn nên đảm bảo SSH vẫn hoạt động nếu cần quản lý tự động.
- Thường xuyên kiểm tra:
pvecm status ceph -s
✅ Kết luận
Việc vô tình xóa ~/.ssh/
có thể tưởng chừng vô hại, nhưng với PVE Cluster thì lại ảnh hưởng lớn đến khả năng giao tiếp giữa các node. Việc hiểu được cơ chế xác thực nội bộ của PVE và Ceph sẽ giúp bạn xử lý các sự cố nhanh chóng và chính xác hơn.
Hy vọng bài viết này sẽ giúp ích cho các sysadmin đang sử dụng cluster Proxmox + Ceph trong môi trường production hoặc lab. Nếu bạn cần script tự động hóa quá trình thiết lập SSH trust cho nhiều node, hãy để lại bình luận – mình sẽ chia sẻ thêm!