我需要创建一个剧本来更新运行在virsh环境中的VM。步骤如下:
我创建了一个带有一些变量的主机文件:
[virsh-hosts]
host1
host2
[vms]
vm1 hypervisor=host1
vm2 hypervisor=host1
vm3 hypervisor=host2因此,例如,在更新VM1时,我需要连接host1、关闭VM1、复制新的映像和xml文件、定义它并启动新的VM。
我的问题是:我如何连接到VM1的管理程序(通过变量),执行关闭,复制新的映像和启动新的VM?
据我所知,剧本中的所有任务都是在正在处理的主机上执行的,但我需要在不同的主机上执行任务(并从变量中获取主机的名称)。
也许delegate_to是这里的解决方案,还是有其他方法?
提前谢谢。
发布于 2014-09-16 08:32:08
您可以在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和facts也将是vm1的任务。
如果您不需要VM的主机/组vars,请使用delegate_to,因为它允许您并行处理多个VM。您应该关闭事实收集(gather_facts: no在hosts: vms行之后),这样ansible就不会尝试ssh到VM,VM可能会被关闭。
如果在此基础上根本没有任何需要与VM联系的场景,那么甚至可以通过在目录中设置ansible_ssh_host来让ansible在VM上运行游戏时始终与虚拟机管理程序联系:
[vms]
vm1 ansible_ssh_host=host1这为您节省了已修复的delegate_to行。
https://stackoverflow.com/questions/25857060
复制相似问题