×

零人工值守:PVE节点内存80%触发,Ansible在线迁移低优先级VM到低负载节点

hqy hqy 发表于2025-10-30 23:55:09 浏览11 评论0

抢沙发发表评论

零人工值守:PVE节点内存80%触发,Ansible在线迁移低优先级VM到低负载节点


场景一句话

家里3台小主机做Proxmox集群,某天某个节点内存飙到80%+,Ansible自动把“不重要的”VM搬到最闲的那台,全程不用你敲一行命令。


先画个流程图(30秒看懂)

内存>80% → 找带标签“migratable”的VM → 挑内存最小的 → qm migrate --online → 完事

准备工作(3步)

  1. 1. 所有节点共享存储(ceph/nfs/zfs均可)
  2. 2. 给“可踢走”的VM打标签
    qm set 105 --tags migratable
  3. 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分钟后回落

常见坑


一句话解决
不是共享存储
把磁盘先挪到ceph,或加 with_local_disks:0 离线迁
目标节点内存也不够
在select里再过滤 free_mem
迁移失败卡住
async: 600
 + poll: 10 让Ansible等10分钟



尾巴

把脚本丢进集群,从此内存告警=自动搬家,安心睡觉。



打赏

本文链接:https://www.kinber.cn/post/5790.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客