如何在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
相关产品推荐
相关产品推荐

