我需要创建一个playbook来更新在virsh环境中运行的VM。步骤将是:
我创建了一个包含一些变量的主机文件:
[virsh-hosts]
host1
host2
[vms]
vm1 hypervisor=host1
vm2 hypervisor=host1
vm3 hypervisor=host2
因此,例如,在更新VM1时,我需要连接host1,关闭VM1,复制新映像和xml文件,定义它并启动新VM。
我的问题是:如何连接到VM1的虚拟机管理程序(通过变量),执行关机,复制新映像并启动新虚拟机?
据我所知,剧本中的所有任务都在正在处理的主机中执行,但我需要在不同的主机上执行任务(并从变量中获取该主机的名称)。
也许delegate_to是这里的解决方案还是有其他方法?
提前致谢。
答案 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
行。