๐ ️ Proxmox VE ่ชๅๅ:CLI + API + Ansible ๅฎๆดๆๅ(้ฒ้็ฏ)
Proxmox VE(PVE)ๆฏ็ฎๅๆๆ็็้ๆบ่ๆฌๅๅนณๅฐไนไธ,ๅ งๅปบ KVM + LXC、ZFS、ๅข้ HA、้ซๅฝๆง API ่ๅฎๅ CLI ๅทฅๅ ท,ๅ ๆญค้ๅธธ้ฉๅๅฐๆฅๅธธ็ฎก็ๆต็จ่ชๅๅ。ๆฌ็ฏๅฐไปฅ้ฒ้ๆ่ก่งๅบฆ,ๆดๅ:
- ๐น PVE CLI ่ชๅๅ็ฎก็
- ๐น PVE REST API(Token ๆนๅผ็ปๅ ฅ)
- ๐น Ansible ่ชๅๅ้จ็ฝฒ PVE / VM / LXC
- ๐น ๅฏฆ้่ชๅๅๆกไพ่่ ณๆฌ็ฏๆฌ
่ฎไฝ ๅพๆฅๅธธ็ฎก็ๅฐๅคง่ฆๆจกไฝ็ฝฒ,้ฝ่ฝๆดๅฟซ、ๆดๆบ็ขบ、ๆดๆจๆบๅ。
๐ ็ฌฌไธ็ซ :Proxmox VE CLI ้ฒ้่ชๅๅ
PVE CLI(pvesh / qm / pct)ๆฏๆๅฟซ、ๆ็ฉฉๅฎ็่ชๅๅๅทฅๅ ท,ไปฅไธๆด็ๆๅธธไฝฟ็จ็ๅฝไปค่ๆกไพ。
1.1 ๆชข่ฆ่็ฎก็ VM
# ๆฅ็ๆๆ VM
qm list
# ๅๅ่ๅๆญข VM
qm start 101
qm shutdown 101
# ๅปบ็ซ VM(ๅฟซ้็ฏๆฌ)
qm create 9000 --name ubuntu-tpl --memory 2048 --cores 2
1.2 ๅฏๅ ฅ OVF / VMDK
# ๅฏๅ
ฅ OVF
qm importovf 105 vm.ovf local-lvm
# ๅฏๅ
ฅ VMDK(ๆ่ฝๆ RAW ๆ QCOW2)
qm importdisk 105 disk.vmdk local-lvm
qm set 105 --scsi0 local-lvm:105/vm-105-disk-0.raw
1.3 LXC ๅฎนๅจ่ชๅๅ
# ๅปบ็ซ LXC
pct create 300 local:vztmpl/ubuntu-22.04-standard.tar.gz \
--hostname test-lxc --cores 2 --memory 2048
# ๅๅ
pct start 300
๐ ็ฌฌไบ็ซ :Proxmox VE REST API(Token)
PVE REST API ๅนพไน่ฆ่ๆๆๅ่ฝ。ๆฌ็ซ ็คบ็ฏไปฅ Token ๆนๅผ็ปๅ ฅ(ๆดๅฎๅ จ、้ฉๅไฝๆฅญ่ชๅๅ)。
2.1 ๅปบ็ซ API Token
ไฝ็ฝฎ:Datacenter → Permissions → API Tokens → Add
User: root@pam
Token ID: ansible
Privilege: Administrator(ๆไพ้ๆฑ)
Expire:(ๅฏ้ธ)
ๅฎๆๅพๆๅๅพ:
- Token ID
- Secret(ๅชๆ้กฏ็คบไธๆฌก)
2.2 ไฝฟ็จ curl ๅผๅซ API
API_URL="https://pve1:8006/api2/json"
TOKEN="root@pam!ansible=yourtoken"
SECRET="yoursecret"
curl -k -H "Authorization: PVEAPIToken=$TOKEN=$SECRET" \
"$API_URL/nodes/pve1/qemu"
2.3 Python ๆไฝ API
import requests
url = "https://pve1:8006/api2/json/nodes/pve1/qemu"
headers = {
"Authorization": "PVEAPIToken=root@pam!ansible=YOURSECRET"
}
resp = requests.get(url, headers=headers, verify=False)
print(resp.json())
๐ ็ฌฌไธ็ซ :ไฝฟ็จ Ansible ่ชๅๅ็ฎก็ Proxmox
Ansible ๆฏ็ฎก็ PVE ๅคง่ฆๆจก็ฐๅข็้ฆ้ธ。ๆฌ็ซ ๆไพๅฎๆด็ฎ้็ตๆง、inventory、ไปฅๅ playbook ็ฏไพ。
3.1 Inventory ็ฏไพ
[pve]
pve1 ansible_host=192.168.10.11
pve2 ansible_host=192.168.10.12
[pve:vars]
ansible_user=root
ansible_ssh_private_key_file=~/.ssh/id_rsa
3.2 ไฝฟ็จ Ansible ๅปบ็ซ VM
- name: Create VM
hosts: pve
tasks:
- name: Create VM via API
uri:
url: "https://{{ inventory_hostname }}:8006/api2/json/nodes/{{ inventory_hostname }}/qemu"
method: POST
validate_certs: no
headers:
Authorization: "PVEAPIToken={{ pve_token }}"
body_format: json
body:
vmid: 200
name: ansible-vm
memory: 2048
3.3 ไฝฟ็จ Ansible ๅปบ็ซ LXC ๅฎนๅจ
- name: Create LXC container
hosts: pve
tasks:
- uri:
url: "https://{{ inventory_hostname }}:8006/api2/json/nodes/{{ inventory_hostname }}/lxc"
method: POST
validate_certs: no
headers:
Authorization: "PVEAPIToken={{ pve_token }}"
body_format: json
body:
vmid: 310
hostname: web01
ostemplate: "local:vztmpl/ubuntu-22.04.tar.gz"
cores: 2
memory: 2048
๐ ็ฌฌๅ็ซ :ๅธธ่ฆ่ชๅๅๅ ดๆฏ่ๆไฝณๅฏฆๅ
4.1 ๅปบ็ซๆจๆบๅ VM ๆจกๆฟๅบซ
- VM ๆจๆบๅ:CPU/Memory/็ถฒๅกๆจกๅ/็ฃ็ข้กๅ
- ๅฎ่ฃ cloud-init ๆฏๆด
- ๅปบ็ซ golden image(Ubuntu / Rocky / Debian)
4.2 ่ชๅๅไปฝ่่ผชๆฟ
# ๆฏๅคฉ 02:00 ๅไปฝๆๆ VM
pvesh create /nodes/pve1/vzdump --all 1 --mode snapshot --compress zstd
4.3 ็ฏ้ปๅฅๅบทๆชขๆฅ(ไปฅ่ ณๆฌๆฟไปฃ GUI)
pvesh get /nodes/pve1/status
pvesh get /cluster/resources
๐ ็ฌฌไบ็ซ :ๅฎๆด่ชๅๅๅฐๆก็ฏไพ
๐ ๅฐๆก็ตๆง:
proxmox-automation/
├── ansible/
│ ├── inventory
│ ├── pve-create-vm.yml
│ ├── pve-create-lxc.yml
│ └── pve-health-check.yml
├── scripts/
│ ├── backup-all.sh
│ ├── import-ovf.sh
│ └── template-build.sh
└── api/
└── python-demo.py
้้กๅฐๆกๅฏ็ดๆฅไธ GitHub,่ฎๅคไบบๅไฝ PVE ็ฎก็。
๐ ็ต่ช
Proxmox VE ๅทฒ็ถไธๅชๆฏ่ๆฌๅๅนณๅฐ,ๆดๆฏ่ฝ่ DevOps、CI/CD、้ ็ฝฎ็ฎก็็ณป็ตฑๆดๅ็ๅฎๆด็ๆ 。้้ CLI、REST API ่ Ansible,ไฝ ๅฏไปฅๅฐๆดๅ็ฐๅข่ชๅๅ、ๆจๆบๅ、ๆจก็ตๅ,ๅคงๅน ้ไฝไบบๅทฅๆไฝ้ฏ่ชค,ไธฆๆๅ้จ็ฝฒ้ๅบฆ。
ๆชไพไนๆๆจๅบ「Proxmox VE ๅคง่ฆๆจกไฝ็ฝฒ่้ซๅฏ็จๆถๆง(Enterprise ็)」ไฝ็บๆฌ็ฏ็ๅปถไผธๅ งๅฎน。
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ