Saturday, July 6, 2024

Làm thế nào để tạo một image Proxmox Ubuntu cloud-init

-

Đây là một lời giải thích về nguyên do tại sao mình muốn tạo một image Ubuntu có cloud-init. Đối với mình các container LXC/LXD ổn định hơn nhiều so với Docker. Mình dự định sử dụng Terraform để triển khai các máy ảo cho cụm Kubernetes của mình (tức là, mình sử dụng image Ubuntu có cloud-init này để tạo các node Kubernetes riêng của mình).

Tải về image gốc của Ubuntu tại https://cloud-images.ubuntu.com/, thật may mắn vì Ubuntu là hệ điều hành mình ưa thích và có lẽ cũng là lựa chọn của nhiều người khác.

wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img

Mình đã mất khá nhiều thời gian trong quá trình gỡ lỗi Terraform và nhận ra rằng gói qemu-guest-agent không có trong image cloud-init. May mắn là có một công cụ rất tuyệt vời mà mình vừa mới biết đến, cho phép cài đặt gói phần mềm trực tiếp vào Image. Công cụ đó được gọi là virt-customize và nó được đóng gói trong gói libguestfs-tools (“libguestfs là một bộ công cụ để truy cập và chỉnh sửa các Image đĩa máy ảo (VM)” – https://www.libguestfs.org/).

Đầu tiên hãy thay đổi list repo mặc định của Proxmox.

cp /etc/apt/sources.list /etc/apt/sources.list.bak
cp /etc/apt/sources.list.d/pve-enterprise.list /etc/apt/sources.list.d/pve-enterprise.list.bak
echo 'deb http://download.proxmox.com/debian/pve bullseye pve-no-subscription' | tee -a /etc/apt/sources.list
rm /etc/apt/sources.list.d/pve-enterprise.list
apt update

Sau đó tiền hành update gói và cài đặt libguestfs.

sudo apt update -y
sudo apt install libguestfs-tools -y

Sau đó cài đặt qemu-guest-agent vào image mới tải xuống:

sudo virt-customize -a focal-server-cloudimg-amd64.img --install qemu-guest-agent

Các lệnh dưới sử dụng công cụ virt-customize để tùy chỉnh image focal-server-cloudimg-amd64.img. Dưới đây là giải thích cho từng lệnh:

  • sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'sudo mkdir -p /root/.ssh/': Tạo thư mục /root/.ssh/ trong Image.
  • sudo virt-customize -a focal-server-cloudimg-amd64.img --copy-in id_rsa:/root/.ssh/: Sao chép file id_rsa vào thư mục /root/.ssh/ trong Image.
  • sudo virt-customize -a focal-server-cloudimg-amd64.img --upload authorized_keys:/root/.ssh/authorized_keys: Tải lên file authorized_keys vào thư mục /root/.ssh/ trong Image.
  • sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'chmod 600 /root/.ssh/id_rsa': Thiết lập quyền truy cập chỉ đọc cho file id_rsa trong thư mục /root/.ssh/.
  • sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'chmod 600 /root/.ssh/authorized_keys': Thiết lập quyền truy cập chỉ đọc cho file authorized_keys trong thư mục /root/.ssh/.
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'sudo mkdir -p /root/.ssh/'
sudo virt-customize -a focal-server-cloudimg-amd64.img --copy-in id_rsa:/root/.ssh/
sudo virt-customize -a focal-server-cloudimg-amd64.img --upload authorized_keys:/root/.ssh/authorized_keys
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'chmod 600 /root/.ssh/id_rsa'
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'chmod 600 /root/.ssh/authorized_keys'
  • sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command """sudo sed -i 's|#PermitRootLogin.*|PermitRootLogin yes|' /etc/ssh/sshd_config""": Sửa đổi file /etc/ssh/sshd_config trong Image để cho phép đăng nhập dưới quyền root qua SSH.
  • sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command """sudo sed -i 's|PermitRootLogin.*|PermitRootLogin yes|' /etc/ssh/sshd_config""": Sửa đổi file /etc/ssh/sshd_config trong Image để cho phép đăng nhập dưới quyền root qua SSH.
  • sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command """sudo sed -i 's|#PasswordAuthentication.*|PasswordAuthentication yes|' /etc/ssh/sshd_config""": Sửa đổi file /etc/ssh/sshd_config trong Image để cho phép xác thực bằng mật khẩu qua SSH.
  • sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command """sudo sed -i 's|PasswordAuthentication.*|PasswordAuthentication yes|' /etc/ssh/sshd_config""": Sửa đổi file /etc/ssh/sshd_config trong Image để cho phép xác thực bằng mật khẩu qua SSH.
  • `sudo virt-customize -a focal-server-cloudimg-amd64.img –run-command “””sudo echo ‘root:hoanghd’ | chpasswd”””: Đặt mật khẩu của người dùng root trong Image thành “hoanghd”.
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command """sudo sed -i 's|#PermitRootLogin.*|PermitRootLogin yes|' /etc/ssh/sshd_config"""
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command """sudo sed -i 's|PermitRootLogin.*|PermitRootLogin yes|' /etc/ssh/sshd_config"""
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command """sudo sed -i 's|#PasswordAuthentication.*|PasswordAuthentication yes|' /etc/ssh/sshd_config"""
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command """sudo sed -i 's|PasswordAuthentication.*|PasswordAuthentication yes|' /etc/ssh/sshd_config"""

Đặt mật khẩu root.

sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command """sudo echo 'root:hoanghd' | chpasswd"""

Sử dụng công cụ qm (Proxmox command line tool) để tạo và cấu hình một máy ảo trên Proxmox. Dưới đây là giải thích cho từng lệnh:

  • sudo qm create 9000 --name "ubuntu-2004-cloudinit-template" --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0: Tạo một máy ảo có ID 9000 với tên là “ubuntu-2004-cloudinit-template”. Máy ảo này có bộ nhớ 2048MB, 2 nhân CPU, và một giao diện mạng được kết nối với bridge “vmbr0” sử dụng ảo hóa giao diện mạng virtio.
  • sudo qm importdisk 9000 focal-server-cloudimg-amd64.img ceph-vm: Nhập Image “focal-server-cloudimg-amd64.img” vào máy ảo với ID 9000 và lưu trữ Image trên pool “ceph-vm”.
  • sudo qm set 9000 --scsihw virtio-scsi-pci --scsi0 ceph-vm:vm-9000-disk-0: Cấu hình phần cứng ổ đĩa cho máy ảo. Đặt loại giao diện SCSI là “virtio-scsi-pci” và kết nối ổ đĩa SCSI với ổ đĩa đã nhập có tên “ceph-vm:vm-9000-disk-0”.
  • sudo qm set 9000 --boot c --bootdisk scsi0: Đặt ổ đĩa SCSI là ổ đĩa khởi động cho máy ảo. Trong trường hợp này, ổ đĩa SCSI sẽ được sử dụng làm ổ đĩa khởi động và được đặt là ổ đĩa “scsi0”.
  • sudo qm set 9000 --ide2 ceph-vm:cloudinit: Cấu hình ổ đĩa IDE thứ hai cho máy ảo. Kết nối ổ đĩa IDE với ổ đĩa “ceph-vm:cloudinit” để sử dụng nội dung cloud-init.
  • sudo qm set 9000 --serial0 socket --vga serial0: Cấu hình các thiết bị nối tiếp và đồ họa cho máy ảo. Đặt thiết bị nối tiếp “serial0” thành loại “socket” và đồ họa “vga” cũng được đặt thành “serial0”.
  • sudo qm set 9000 --agent enabled=1: Kích hoạt dịch vụ qemu-guest-agent trên máy ảo. Điều này cho phép giao tiếp giữa Proxmox host và máy ảo để thực hiện các tác vụ quản lý như sao lưu, khôi phục, và theo dõi.
sudo qm create 9000 --name "ubuntu-2004-cloudinit-template" --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0
sudo qm importdisk 9000 focal-server-cloudimg-amd64.img ceph-vm
sudo qm set 9000 --scsihw virtio-scsi-pci --scsi0 ceph-vm:vm-9000-disk-0
sudo qm set 9000 --boot c --bootdisk scsi0
sudo qm set 9000 --ide2 ceph-vm:cloudinit
sudo qm set 9000 --serial0 socket --vga serial0
sudo qm set 9000 --agent enabled=1

Lệnh này để chuyển đổi máy ảo có ID là 9000 thành Template.

sudo qm template 9000

Nếu bạn muốn xoá Template có ID 9000 thì sử dụng lệnh.

sudo qm destroy 9000

Dưới đây là giải thích cho từng lệnh trong đoạn văn bản tiếng Anh:

  • sudo qm clone 9000 999 --name test-clone-cloud-init: Sao chép máy ảo có ID 9000 và tạo một bản sao với ID 999 và tên là “test-clone-cloud-init”. Điều này tạo ra một bản sao của máy ảo gốc để sử dụng trong mục đích kiểm tra hoặc phát triển.
  • sudo qm set 999 --sshkey ~/.ssh/id_rsa.pub: Đặt khóa SSH cho máy ảo với ID 999. Lệnh này sẽ thiết lập khóa công khai SSH từ file id_rsa.pub trong thư mục ~/.ssh/ cho máy ảo.
  • sudo qm set 999 --ipconfig0 ip=192.168.13.232/24,gw=192.168.12.5: Đặt cấu hình IP cho giao diện mạng 0 của máy ảo có ID 999. Máy ảo sẽ có địa chỉ IP là 192.168.13.232 với subnet mask /24 và gateway là 192.168.12.5.
  • sudo qm start 999: Khởi động máy ảo có ID 999. Lệnh này sẽ bật máy ảo và cho phép nó chạy trong môi trường ảo hóa.

Tóm lại, chuỗi các lệnh trên được sử dụng để sao chép một máy ảo từ máy ảo gốc, đặt khóa SSH và cấu hình mạng cho máy ảo sao chép, và cuối cùng khởi động máy ảo để sử dụng nó.

sudo qm clone 9000 999 --name test-clone-cloud-init
sudo qm set 999 --sshkey ~/.ssh/id_rsa.pub
sudo qm set 999 --ipconfig0 ip=192.168.13.232/24,gw=192.168.12.5
sudo qm start 999

Giờ đây bạn có thể ssh vào máy ảo vừa tạo.

ssh ubuntu@192.168.13.232

Hoặc

ssh root@192.168.13.232

Khi bạn hài lòng với cách mọi thứ hoạt động, bạn có thể dừng VM và dọn sạch tài nguyên:

sudo qm stop 999 && sudo qm destroy 999
rm focal-server-cloudimg-amd64.img

Bạn có thể tự động hóa quy trình tạo máy ảo bằng cách sử dụng một file shell đơn giản. Bằng cách tổ chức các lệnh trong một script shell, bạn có thể thực hiện các bước cần thiết để tạo máy ảo một cách tự động.

Script shell này có thể được chạy tự động thông qua cron theo một lịch trình cụ thể, ví dụ như hàng tuần hoặc tần suất mong muốn khác. Việc tạo ra một template máy ảo đã được cấu hình sẵn sẽ giúp tiết kiệm thời gian và giải quyết vấn đề cần phải chạy sudo apt update sau mỗi lần tạo máy ảo mới. Dưới đây là đoạn script ví dụ.

# installing libguestfs-tools only required once, prior to first run
sudo apt update -y
sudo apt install libguestfs-tools -y

# remove existing image in case last execution did not complete successfully
rm focal-server-cloudimg-amd64.img
wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
sudo virt-customize -a focal-server-cloudimg-amd64.img --install qemu-guest-agent
sudo qm create 9000 --name "ubuntu-2004-cloudinit-template" --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0
sudo qm importdisk 9000 focal-server-cloudimg-amd64.img local-zfs
sudo qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-zfs:vm-9000-disk-0
sudo qm set 9000 --boot c --bootdisk scsi0
sudo qm set 9000 --ide2 local-zfs:cloudinit
sudo qm set 9000 --serial0 socket --vga serial0
sudo qm set 9000 --agent enabled=1
sudo qm template 9000
rm focal-server-cloudimg-amd64.img
echo "next up, clone VM, then expand the disk"
echo "you also still need to copy ssh keys to the newly cloned VM"

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories