零人工值守:PVE节点内存80%触发,Ansible在线迁移低优先级VM到低负载节点
场景一句话
家里3台小主机做Proxmox集群,某天某个节点内存飙到80%+,Ansible自动把“不重要的”VM搬到最闲的那台,全程不用你敲一行命令。
先画个流程图(30秒看懂)
内存>80% → 找带标签“migratable”的VM → 挑内存最小的 → qm migrate --online → 完事
准备工作(3步)
1. 所有节点共享存储(ceph/nfs/zfs均可) 2. 给“可踢走”的VM打标签 qm set 105 --tags migratable
3. 管理机装好依赖 pip install proxmoxer requests
一键脚本(copy即用)
目录结构:
migrate-when-ram-high/├── site.yml├── migrate.yml└── inventory
① inventory(动态,官方脚本)
[inventory]enable_plugins = proxmox
② site.yml(入口)
- hosts: localhost tasks: - include_tasks: migrate.yml vars: 阈值: 80 # 内存% 标签: migratable
③ migrate.yml(核心)
- name:1.获取集群节点内存
uri:
url:https://{{pve_host}}:8006/api2/json/nodes
headers:
Authorization:"PVEAPIToken={{ token }}"
validate_certs:no
register:nodes
-name:2.找出内存>80%的节点
set_fact:
hot_node:"{{ item.node }}"
when:item.mem*100/item.maxmem>阈值
loop:"{{ nodes.json.data }}"
-name:3.找最闲节点
set_fact:
cool_node:"{{ (nodes.json.data | sort(attribute='mem') | first).node }}"
-name:4.选可迁移的最小VM
uri:
url:https://{{pve_host}}:8006/api2/json/nodes/{{hot_node}}/qemu
headers:
Authorization:"PVEAPIToken={{ token }}"
register:vms
-name:5.执行在线迁移
uri:
url:https://{{pve_host}}:8006/api2/json/nodes/{{hot_node}}/qemu/{{item.vmid}}/migrate
method:POST
headers:
Authorization:"PVEAPIToken={{ token }}"
body:
target:"{{ cool_node }}"
online:1
loop: "{{ vms.json.data | selectattr('tags','search',标签) | sort(attribute='mem') | first }}"
跑起来
# dry-run 先看迁谁ansible-playbook site.yml --check# 真刀真枪ansible-playbook site.yml
让定时器每1分钟查一次
systemctl edit --force --full ansible-migrate.timer
[Unit]Description=Check RAM and migrate if needed[Timer]OnCalendar=*:*:00Persistent=true[Install]WantedBy=timers.target
systemctl enable --now ansible-migrate.timer
效果截图(手机也能看)
Node-1 内存 82% → 触发VM-105(nextcloud) 2 GB → 搬到 Node-3Node-1 内存 58% ← 1分钟后回落
常见坑
with_local_disks:0 离线迁 | |
free_mem | |
async: 600poll: 10 让Ansible等10分钟 |
尾巴
把脚本丢进集群,从此内存告警=自动搬家,安心睡觉。
本文链接:https://www.kinber.cn/post/5790.html 转载需授权!
推荐本站淘宝优惠价购买喜欢的宝贝:

支付宝微信扫一扫,打赏作者吧~
