在虚拟机管理程序上运行时,我们如何限制“虚拟机”上的 ansible?

问题描述 投票:0回答:1

我是 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
ansible
1个回答
0
投票

问:“仅重新部署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
© www.soinside.com 2019 - 2024. All rights reserved.