สร้าง Ubuntu cloud-init image
Cloud-init service มาตรฐานที่ใช้ customize พวก Linux-based OS บน cloud เพื่อให้เราสามารถแก้ไข้การตั้งค่าพื้นฐานของ OS ได้ ไม่ต้องรอให้เรา spin VM แล้วค่อยเข้าไปแก้ และด้วยอย่างที่บอกว่ามันเป็นมาตรฐานของอุตสาหกรรมไอที Linux distro ใหญ่ๆ จึงรองรับ Feature นี้หมด
มันคืออะไร?
Cloud-init service มาตรฐานที่ใช้ customize พวก Linux-based OS บน cloud เพื่อให้เราสามารถแก้ไข้การตั้งค่าพื้นฐานของ OS ได้ ไม่ต้องรอให้เรา spin VM แล้วค่อยเข้าไปแก้ และด้วยอย่างที่บอกว่ามันเป็นมาตรฐานของอุตสาหกรรมไอที Linux distro ใหญ่ๆ จึงรองรับ Feature นี้หมด
เพราะอะไร เราถึงควรใช้?
ผมขอยกตัวอย่าง อย่างเช่นถ้าเราต้องการจะสร้าง instance สัก 3 ตัว โดยมีชื่อดังต่อไปนี้
VM1: utilitee-k8s-master1
VM2: utilitee-k8s-node1
VM3: utilitee-k8s-node2
VM4: utilitee-k8s-node3และต้องเพิ่ม public key เข้าไปใน VM แต่ละตัว พร้อมทั้งต้องติดตั้ง node_exporter เพื่อใช้ในการ monitor resource และ create user ด้วย ซึ่งถ้าเป็น generic OS เราต้องจัดการทีละ VM ตั้งแต่เปลี่ยนชื่อ แอดคีย์ ติดตั้ง package node_exporter และสร้าง user
แต่ถ้าเราใช้ Cloud-init เราก็จะสามารถทำการแก้ไข OS image ไว้ก่อนเลยเหมือนเป็น template แล้วค่อย spin VM จาก OS image นั้น, ประหยัดเวลา ลด human error
งั้นเรามาเริ่มกันเลย
เริ่มจากโหลด OS image มาก่อน ซึ่งในที่นี้ ผมใช้ Ubuntu 20.04 จากนั้นติดตั้ง package libguestfs-tools บนเครื่องหลักของเราก่อน
wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
จากนั้นมาเริ่มแก้ไข image OS ของเรากัน โดยเราจะใช้เครื่องมือชื่อ virt-customize ในการแก้ไข ดังนั้นมาติดตั้ง libguestfs-tools package กันครับ
sudo apt install libguestfs-toolsจากนั้นก็เซ็ต image ของเราตามชอบได้เลย ซึ่งอันนี้เป็นตัวอย่างของผม
- # Setup public key
nano mypubkey
- # ติดตั้ง qemu-guest-agent ให้ image (optional นะครับอันนี้)
sudo virt-customize -a focal-server-cloudimg-amd64.img --install qemu-guest-agent
- # สร้าง utilitee and จากนั้นเพิ่มเข้า group sudo
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'useradd -s /bin/bash -d /home/utilitee/ -m -G sudo utilitee'
- # สร้าง .ssh dir เพื่อเตรียมใส่คีย์
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'mkdir -p /home/utilitee/.ssh'
- # เพิ่ม public คีย์เข้าไปในเครื่องของเราครับ ในที่นี้คีย์ของผมอยู่ใน /home/utilitee/cloud-init-tutorial/mypubkey
sudo virt-customize -a focal-server-cloudimg-amd64.img --ssh-inject utilitee:file:/home/utilitee/cloud-init-tutorial/mypubkey
- # set permission
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'chown -R utilitee:utilitee /home/utilitee'
- # Set root password โดยรหัสผมอยู่ใน file /root/rootpw ซึ่งถ้าลอง cat file ดู ก้จะได้ dnnq7oy&eGn6^UN6MJSPU4iqYsjC25F4
sudo virt-customize -a focal-server-cloudimg-amd64.img --root-password file:/root/rootpw
- # เช่นเดียวกัน แต่เป็นรหัสสำหรับ user utilitee
sudo virt-customize -a focal-server-cloudimg-amd64.img --password utilitee:file:/root/userpw
- # Install node_exporter แต่ก่อนอื่นต้องไปโหลด file node_exporter มาก่อนนะครับ https://ourcodeworld.com/articles/read/1686/how-to-install-prometheus-node-exporter-on-ubuntu-2004/
sudo virt-customize -a focal-server-cloudimg-amd64.img --copy-in node_exporter/node_exporter:/usr/local/bin/
- # สร้าง user node_exporter เพื่อใช้สำหรับ node_exporter แยกต่างหาก
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'useradd --no-create-home --shell /bin/false node_exporter'
- # Set permission
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'chown node_exporter:node_exporter /usr/local/bin/node_exporter'
- # สร้าง node_exporter systemd service
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'touch /etc/systemd/system/node_exporter.service'
- # Set permission
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'chmod 664 /etc/systemd/system/node_exporter.service'
- # แก้ไขไฟล์ node_exporter.service
virt-edit -a focal-server-cloudimg-amd64.img /etc/systemd/system/node_exporter.service
edit node_exporter.service
--------------------------------------------
[Unit]
Description=Node Exporter
Documentation=https://ourcodeworld.com/articles/read/1686/how-to-install-prometheus-node-exporter-on-ubuntu-2004/
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
--------------------------------------------
- # Daemon reload
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'systemctl daemon-reload'
- # Enable node_exporter เพื่อให้ service start on boot
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'systemctl enable node_exporter.service'
- # Start node_exporter
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'systemctl start node_exporter'
- # Change VM's timezone ผมใช้ Asia/Bangkok
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'unlink /etc/localtime'
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command 'ln -s /usr/share/zoneinfo/Asia/Bangkok /etc/localtime'
- # ลบ machine-id ใน image ออก (ไม่งั้นปัญหาแรกที่เจอเลยคือได้ ip ซ้ำ)
sudo virt-customize -a focal-server-cloudimg-amd64.img --run-command "echo -n > /etc/machine-id"
Summary
เพียงเท่านี้เราก็จะได้ Cloud-init image ของเราเองแล้ว สามารถนำไปใช้ได้เลย ซึ่งกรณีนี้ผมใช้กับ Proxmox Server ของผมเอง และนี่คือตัวอย่างของ VM ที่ผมสร้าง ซึ่งผมแอดคีย์เข้าไปหลายคีย์สำหรับ Terraform, Proxmox, Ansible, PC, Laptop และติดตั้ง node exporter เรียบร้อยแล้ว

