สร้าง Ubuntu cloud-init image

Cloud-init service มาตรฐานที่ใช้ customize พวก Linux-based OS บน cloud เพื่อให้เราสามารถแก้ไข้การตั้งค่าพื้นฐานของ OS ได้ ไม่ต้องรอให้เรา spin VM แล้วค่อยเข้าไปแก้ และด้วยอย่างที่บอกว่ามันเป็นมาตรฐานของอุตสาหกรรมไอที Linux distro ใหญ่ๆ จึงรองรับ Feature นี้หมด

สร้าง Ubuntu cloud-init image

มันคืออะไร?

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 เรียบร้อยแล้ว

Read more

Restore MySQL DB ด้วย Binlog file

Restore MySQL DB ด้วย Binlog file

สวัสดีครับ วันนี้พลาดครับ เรื่องของเรื่องคือผมจะกลับมาเขียน blog เลยมาเช็ต blog ที่ผมรันไว้ ซึ่งผมรัน Ghost CMS blog บน docker แต่ดั๊นใช้ tag <:latest> ซึ่งใน compose file มีทั้ง ghost และ mysql ด้วยความที่รันไว้นานแล้ว และไม่ได้บันทึกอะไรไว้ มาถึงผมก็จัดแจง restart .... ไม่ขึ้นครับ

By Akachai Bunsorn