我是 Ansible 的新手,我正在尝试弄清楚如何使用
--limit
参数,但对于特定的虚拟机而不是虚拟机管理程序/主机本身。
我解释一下自己:我在 Proxmox 虚拟机管理程序上使用了一些角色。像 Deploy-vms、Erase-vms、Snapshop-VM 等,但我想用一个简单的方法来表示,例如仅重新部署 VM20 和 VM21。
由于 playbook 在虚拟机管理程序上运行,而不是在虚拟机上运行,因此问题是像
ansible-playbook -i proxmox.yaml playbook-deploy-vms.yml --limit 'vm20,vm21'
这样的命令将不起作用,因为唯一可用的主机是 Proxmox 节点本身。第二步它将回滚虚拟机。 (我试图将回滚限制为特定的虚拟机子集)
有没有办法在不向每个任务添加
when
子句的情况下实现这一目标?
这是
proxmox.yaml
文件:
all:
vars:
ansible_user: root
pve:
hosts:
pve.domain.local
例如,这是我在恢复角色中的任务。它将从虚拟机管理程序获取所有虚拟机并注册用于下一步的变量。
---
- name: List all VMs on {{ node }}
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: Rollback VMs from snapshot
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 }}"
剧本就是这样定义的:
---
- name: Restore VMs
hosts: pve # Here we use the proxmox hypervisor node
roles:
- restore-vms
问:“仅重新部署VM20和VM21。”
A:您可以对清单中的主机使用参数 --limit。在您描述的情况下,虚拟机不在清单中。它们列在注册变量vms中。让我们从 doc 中获取示例并将其应用到我们的案例中
vms:
proxmox_vms:
- {cpu: 0.258944410905281, cpus: 1, disk: 0, diskread: 0, diskwrite: 0, id: qemu/100,
maxcpu: 1, maxdisk: 34359738368, maxmem: 4294967296, mem: 35158379, name: pxe.home.arpa,
netin: 99715803, netout: 14237835, node: pve, pid: 1947197, status: running, template: false,
type: qemu, uptime: 135530, vmid: 100}
- {cpu: 0, cpus: 1, disk: 0, diskread: 0, diskwrite: 0, id: qemu/101, maxcpu: 1, maxdisk: 0,
maxmem: 536870912, mem: 0, name: vm20, netin: 0, netout: 0, node: pve, status: stopped,
template: false, type: qemu, uptime: 0, vmid: 101}
- {cpu: 0, cpus: 1, disk: 0, diskread: 0, diskwrite: 0, id: qemu/102, maxcpu: 1, maxdisk: 0,
maxmem: 536870912, mem: 0, name: vm21, netin: 0, netout: 0, node: pve, status: stopped,
template: false, type: qemu, uptime: 0, vmid: 101}
上例中有三个虚拟机:pxe.home.arpa、vm20和vm21。您必须提供一个包含选定(有限)虚拟机的变量。例如,让我们将它们放入一个可以在命令行上轻松使用的逗号分隔字符串,并将其转换为 YAML 列表
limit: vm20,vm21
limit_list: "{{ limit | d('') | split(',') | map('trim') }}"
然后使用过滤器 selectattr 并仅迭代选定的 VM。例如,
- debug:
msg: "Redeploy {{ item.name }} {{ item.id }}"
loop: "{{ vms.proxmox_vms | selectattr('name', 'in', limit_list) }}"
loop_control:
label: "{{ item.name }}"
给予
ok: [localhost] => (item=vm20) =>
msg: Redeploy vm20 qemu/101
ok: [localhost] => (item=vm21) =>
msg: Redeploy vm21 qemu/102
在您的情况下,将有虚拟机管理程序而不是本地主机。 debug 任务演示了这个想法。适合您的需求。
仅完整剧本示例
shell> cat pb.yml
- hosts: localhost
vars:
vms:
proxmox_vms:
- {cpu: 0.258944410905281, cpus: 1, disk: 0, diskread: 0, diskwrite: 0, id: qemu/100,
maxcpu: 1, maxdisk: 34359738368, maxmem: 4294967296, mem: 35158379, name: pxe.home.arpa,
netin: 99715803, netout: 14237835, node: pve, pid: 1947197, status: running, template: false,
type: qemu, uptime: 135530, vmid: 100}
- {cpu: 0, cpus: 1, disk: 0, diskread: 0, diskwrite: 0, id: qemu/101, maxcpu: 1, maxdisk: 0,
maxmem: 536870912, mem: 0, name: vm20, netin: 0, netout: 0, node: pve, status: stopped,
template: false, type: qemu, uptime: 0, vmid: 101}
- {cpu: 0, cpus: 1, disk: 0, diskread: 0, diskwrite: 0, id: qemu/102, maxcpu: 1, maxdisk: 0,
maxmem: 536870912, mem: 0, name: vm21, netin: 0, netout: 0, node: pve, status: stopped,
template: false, type: qemu, uptime: 0, vmid: 101}
limit_list: "{{ limit | d('') | split(',') | map('trim') }}"
tasks:
- debug:
var: vms.proxmox_vms | to_yaml
- debug:
var: limit_list | to_yaml
- debug:
msg: "Redeploy {{ item.name }} {{ item.id }}"
loop: "{{ vms.proxmox_vms | selectattr('name', 'in', limit_list) }}"
loop_control:
label: "{{ item.name }}"
如果您在没有定义变量limit的情况下运行播放,则循环将跳过空列表。在命令行上声明变量limit。例如,下面的命令给出了上面提到的结果
shell> ansible-playbook pb1.ym -e limit=vm20,vm21