You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Proxmox宿主机上用Ansible限制操作指定VM?

实现Proxmox中通过命令行指定仅回滚特定VM

你的问题核心在于Ansible的--limit是针对inventory中的主机过滤的,但你的inventory只有Proxmox节点,没法直接过滤VM。下面提供一种无需修改每个任务when子句的方案,通过命令行传递变量来指定要回滚的VM:

方案步骤

1. 修改Restore角色的任务文件

调整回滚任务的loop逻辑,让它根据命令行传入的VMID列表过滤目标VM,默认情况下仍处理所有VM:

---
- name: 列出{{ node }}上的所有VM
  community.general.proxmox_vm_info:
    api_user: "{{ api_user }}"
    api_token_id: "{{ api_token_id }}"
    api_token_secret: "{{ api_token_secret }}"
    api_host: "{{ api_host }}"
    node: "{{ node }}"
  register: vms

- name: 回滚指定VM到快照
  community.general.proxmox_snap:
    api_user: "{{ api_user }}"
    api_token_id: "{{ api_token_id }}"
    api_token_secret: "{{ api_token_secret }}"
    api_host: "{{ api_host }}"
    vmid: "{{ item.vmid }}"
    state: rollback
    snapname: OriginalVersion
  loop: "{{ vms.proxmox_vms | selectattr('vmid', 'in', (target_vms | default(vms.proxmox_vms | map(attribute='vmid') | list) | split(',') | map('int') | list)) | list }}"

2. 命令行运行时指定目标VM

通过-e参数传递要回滚的VMID,格式支持逗号分隔:

ansible-playbook playbook.yml -e "target_vms=20,21"

如果不指定target_vms变量,playbook会默认回滚所有VM,和原来的行为一致。

原理说明

  • 用selectattr过滤器从所有VM列表中筛选出vmid在target_vms中的项
  • default参数确保没有传参时仍使用全部VM的ID列表
  • split(',')和map('int')处理逗号分隔的字符串,转换成整数ID列表,适配命令行的输入格式

内容的提问来源于stack exchange,提问作者Kantium

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 09:35:12