Ansible:更新virsh VM

时间:2014-09-15 21:19:04

标签: virtual-machine ansible

我需要创建一个playbook来更新在virsh环境中运行的VM。步骤将是:

  1. 备份VM的一些内容(完成)
  2. 关闭虚拟机
  3. 复制新的VM映像和XML文件
  4. 恢复备份(只需安装映像并解压缩文件)
  5. 启动新VM
  6. 我创建了一个包含一些变量的主机文件:

    [virsh-hosts]
    host1
    host2
    
    [vms]
    vm1 hypervisor=host1
    vm2 hypervisor=host1
    vm3 hypervisor=host2
    

    因此,例如,在更新VM1时,我需要连接host1,关闭VM1,复制新映像和xml文件,定义它并启动新VM。

    我的问题是:如何连接到VM1的虚拟机管理程序(通过变量),执行关机,复制新映像并启动新虚拟机?

    据我所知,剧本中的所有任务都在正在处理的主机中执行,但我需要在不同的主机上执行任务(并从变量中获取该主机的名称)。

    也许delegate_to是这里的解决方案还是有其他方法?

    提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以在virsh-hosts群组中投放游戏,并在vms群中循环播放条件:

- hosts: virsh-hosts
  tasks:
    - name: Do something on all vms on this host
      ping:
      when: hostvars[item].hypervisor == inventory_name
      with_items: groups.vms

您也可以在vms群组上投放,并像您说的那样使用delegate_to

- hosts: vms
  gather_facts: no
  tasks:
    - ping:
      delegate_to: "{{hypervisor}}"

这里最大的区别是可用的组和主机变量。如果委派任务,则可用变量仍然是原始计算机之一。这意味着即使任务将在host1上运行,host_vars,group_vars和fact也将是vm1

如果您不需要VM的主机/组vars,请使用delegate_to,因为它允许您并行处理多个VM。您应该关闭事实收集(gather_facts: no行之后的hosts: vms),因此ansible不会尝试ssh到VM,这可能会被关闭。

如果最重要的是你根本没有任何需要联系虚拟机的场景,你甚至可以通过设置{{1}在办公室上运行游戏时始终联系虚拟机管理程序在库存中:

ansible_ssh_host

这可以节省您重复的[vms] vm1 ansible_ssh_host=host1 行。