Mục tiêu học tập
cloud-init Framework
Hiểu cơ chế cloud-init hoạt động để cấu hình Linux cloud instances tự động khi khởi động lần đầu tiên.
user-data và meta-data
Tạo và cấu hình hai file cloud-init: meta-data (thông tin instance) và user-data (cấu hình OS bên trong).
Cloud Images (qcow2)
Tải và sử dụng cloud images từ Fedora, Ubuntu, RHEL; tạo snapshots với qemu-img; copy images vào libvirt.
SSH Key Injection
Inject SSH public keys vào cloud instances qua cloud-init để cho phép passwordless login vào VMs.
Cloning Cloud Instances
Clone cloud instances dùng virt-manager hoặc virt-clone để nhanh chóng tạo nhiều VMs từ template.
Public Cloud Deployment
Hiểu cách deploy Linux instances trên AWS EC2, Azure VM và OpenStack với cloud-init.
Lý thuyết: Deploying Linux to the Cloud
1. cloud-init là gì?
cloud-init là công cụ tiêu chuẩn để cấu hình Linux cloud instances. Thay vì cài đặt thủ công, cloud-init tự động thiết lập OS khi VM boot lần đầu: set hostname, tạo users, inject SSH keys, cài đặt packages, chạy scripts.
cloud-init process flow:
1. Boot
VM starts
2. Detect
Find data source
3. Read
meta-data + user-data
4. Configure
Apply settings
5. Ready
Instance usable
2. File meta-data
File meta-data chứa thông tin nhận dạng instance từ bên ngoài: instance ID, hostname.
instance-id
: FedoraWS01local-hostname
: fedora01.example.comavailability-zone
: us-east-1a3. File user-data
File user-data cấu hình bên trong OS. Phải bắt đầu bằng #cloud-config. Hỗ trợ nhiều directives: password, ssh keys, packages, runcmd.
#cloud-config
password
: cloudpasschpasswd
: {expire: False}ssh_pwauth
: Truessh_authorized_keys
:- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... user@laptop
packages
:- nginx
- git
- vim
package_update
: trueruncmd
:- systemctl enable --now nginx
- firewall-cmd --add-service=http --permanent
- firewall-cmd --reload
users
:- name: devops
sudo: ['ALL=(ALL) NOPASSWD:ALL']
groups: wheel
shell: /bin/bash
ssh_authorized_keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... devops@workstation
4. Tạo ISO data image và Snapshot
# Cài đặt công cụ cần thiết
$ sudo dnf install genisoimage cloud-init qemu-img virt-install -y
# Tạo ISO chứa meta-data và user-data
$ genisoimage -output fedora42-data.iso \
-volid cidata \
-joliet -rock \
user-data meta-data
Total translation table size: 0
Total rock ridge attributes bytes: 0
Total directory bytes: 0
Writing: Initial Padblock Start Block 0
# Tạo snapshot của cloud image (để giữ nguyên bản gốc)
$ qemu-img create -f qcow2 \
-o backing_file=Fedora-Cloud-Base-Generic-42-1.1.x86_64.qcow2 \
-F qcow2 Fedora-Cloud-Base-01.qcow2
Formatting 'Fedora-Cloud-Base-01.qcow2', fmt=qcow2
# Xem thông tin image
$ qemu-img info Fedora-Cloud-Base-01.qcow2
image: Fedora-Cloud-Base-01.qcow2
file format: qcow2
virtual size: 10 GiB (10737418240 bytes)
disk size: 392 KiB
backing file: Fedora-Cloud-Base-Generic-42-1.1.x86_64.qcow2
5. Khởi động Cloud Instance
# Copy images vào libvirt images directory
$ sudo cp Fedora-Cloud-Base-01.qcow2 \
fedora42-data.iso \
/var/lib/libvirt/images/
# Khởi động cloud instance
$ cd /var/lib/libvirt/images
$ sudo virt-install --import \
--name fedora42-01 \
--ram 4096 --vcpus 2 \
--disk path=Fedora-Cloud-Base-01.qcow2,format=qcow2,bus=virtio \
--disk path=fedora42-data.iso,device=cdrom \
--os-variant fedora42 \
--network network=default &
Starting install...
Domain 'fedora42-01' is running.
# Mở console VM
$ virt-viewer fedora42-01
# Đăng nhập: user=fedora, password=cloudpass
6. Kiểm tra Cloud Instance
# Kiểm tra user-data đã được áp dụng
[fedora@fedora01 ~]$ sudo cat /var/lib/cloud/instances/nocloud/user-data.txt
#cloud-config
password: cloudpass
chpasswd: {expire: False}
# Xem cloud-init config
[fedora@fedora01 ~]$ sudo cat /etc/cloud/cloud.cfg | head -20
users:
- default
disable_root: true
system_info:
default_user:
name: fedora
sudo: ["ALL=(ALL) NOPASSWD:ALL"]
shell: /bin/bash
# Xem cloud-init logs
[fedora@fedora01 ~]$ sudo journalctl -u cloud-init --no-pager | tail -20
cloud-init[1234]: Cloud-init v. 24.3 finished at Tue, 01 Apr 2025
7. Triển khai lên Public Cloud (AWS/Azure)
AWS EC2 với cloud-init
- • Chọn AMI (Amazon Machine Image) Linux
- • Chọn instance type (t2.micro, t3.small...)
- • Chọn key pair cho SSH access
- • Trong "Advanced Details" > User data: paste nội dung user-data
- • cloud-init chạy tự động khi instance boot
Azure VM với cloud-init
- • Chọn Ubuntu/RHEL/Fedora image từ Marketplace
- • Trong "Advanced" tab, chọn "Enable cloud-init"
- • Upload hoặc paste user-data content
- • Azure hỗ trợ cloud-init natively
- • SSH key tự động inject qua Azure portal
Lab Thực Hành
Tạo và deploy một Fedora cloud instance với cloud-init, cài đặt Nginx tự động và inject SSH key để đăng nhập không cần password.
Tạo SSH key pair
$ ssh-keygen -t ed25519 -C "cloud-lab" -f ~/.ssh/cloud-lab
Generating public/private ed25519 key pair.
Your identification has been saved in /home/user/.ssh/cloud-lab
$ cat ~/.ssh/cloud-lab.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... cloud-lab
Tạo file meta-data
instance-id
: lab-webserver-01local-hostname
: webserver01Tạo file user-data với SSH key và Nginx
#cloud-config
ssh_authorized_keys
:- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... cloud-lab
packages
:- nginx
runcmd
:- systemctl enable --now nginx
- echo "<h1>Cloud Instance Ready!</h1>" > /usr/share/nginx/html/index.html
Tạo ISO và Snapshot
$ genisoimage -output webserver-data.iso -volid cidata -joliet -rock user-data meta-data
$ qemu-img create -f qcow2 \
-o backing_file=Fedora-Cloud-Base-Generic-42-1.1.x86_64.qcow2 \
-F qcow2 webserver-01.qcow2
Khởi động Cloud Instance
$ sudo cp webserver-01.qcow2 webserver-data.iso /var/lib/libvirt/images/
$ sudo virt-install --import --name webserver-01 \
--ram 2048 --vcpus 2 \
--disk path=/var/lib/libvirt/images/webserver-01.qcow2,format=qcow2,bus=virtio \
--disk path=/var/lib/libvirt/images/webserver-data.iso,device=cdrom \
--os-variant fedora42 --network network=default &
SSH vào Instance và Kiểm tra Nginx
$ virsh domifaddr webserver-01
Name MAC address Protocol Address
vnet0 52:54:00:12:34:56 ipv4 192.168.122.77/24
$ ssh -i ~/.ssh/cloud-lab [email protected]
[fedora@webserver01 ~]$ systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
Active: active (running)
[fedora@webserver01 ~]$ curl http://localhost
<h1>Cloud Instance Ready!</h1>
Clone Cloud Instance
$ virsh shutdown webserver-01
$ virt-clone --original webserver-01 \
--name webserver-02 \
--auto-clone
Cloning 'webserver-01'... 100% [===================] 3.1 GB 55 MB/s in 58s
$ virsh start webserver-02
Câu hỏi ôn tập
cloud-init là gì và tại sao nó quan trọng với cloud images?
Sự khác biệt giữa file meta-data và user-data trong cloud-init?
#cloud-config. Cho phép set passwords, SSH keys, install packages, run commands. User data do người dùng định nghĩa.
Tại sao cần tạo snapshot của cloud image trước khi dùng?
qemu-img create -f qcow2 -o backing_file=...) tạo ra một file nhỏ chỉ lưu changes. Điều này cho phép: (1) revert về trạng thái ban đầu dễ dàng; (2) tạo nhiều VMs từ cùng base image; (3) tiết kiệm disk space.
Lệnh genisoimage dùng để làm gì trong workflow cloud-init?
genisoimage tạo một ISO image chứa files meta-data và user-data. ISO này được gắn như CD-ROM vào VM (--disk path=...iso,device=cdrom). cloud-init tìm data source "NoCloud" từ CD-ROM có volume label "cidata" và đọc cấu hình từ đó khi boot.
Làm thế nào để inject SSH key vào cloud instance qua cloud-init?
ssh_authorized_keys:ssh_authorized_keys:
- ssh-ed25519 AAAAC3... user@hostcloud-init sẽ copy public key này vào file
~/.ssh/authorized_keys của default user, cho phép SSH passwordless vào instance.
Directive runcmd trong user-data dùng để làm gì?
runcmd chạy các lệnh shell tùy ý khi instance boot lần đầu. Chạy một lần sau khi tất cả modules khác đã xử lý. Ví dụ: enable services (systemctl enable --now nginx), cấu hình firewall, chạy scripts. Khác với packages (chỉ install packages từ repos).
Tại sao cloud images thường disable root login?
disable_root: true trong cloud.cfg ngăn đăng nhập trực tiếp với root. Thay vào đó, một non-root user mặc định (fedora, ubuntu, ec2-user) được tạo với sudo privileges và SSH key access. Điều này giảm attack surface và buộc dùng sudo cho privileged operations — best practice cho cloud security.
Lệnh qemu-img info cho biết thông tin gì về cloud image?
qemu-img info <image> hiển thị: file format (qcow2/raw), virtual size (tổng dung lượng), disk size (dung lượng thực đang dùng), backing file (nếu là snapshot), số snapshots, cluster size. Đặc biệt hữu ích để xác nhận backing file trong snapshot chain.