首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ansible:更新virsh

Ansible:更新virsh
EN

Stack Overflow用户
提问于 2014-09-15 21:19:03
回答 1查看 1.9K关注 0票数 1

我需要创建一个剧本来更新运行在virsh环境中的VM。步骤如下:

  1. 备份VM的某些内容(已完成)
  2. 关闭vm
  3. 复制新的VM映像和XML文件
  4. 还原备份(只需挂载映像并取消文件)
  5. 启动新的VM

我创建了一个带有一些变量的主机文件:

代码语言:javascript
复制
[virsh-hosts]
host1
host2

[vms]
vm1 hypervisor=host1
vm2 hypervisor=host1
vm3 hypervisor=host2

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

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

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

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

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-16 08:32:08

您可以在virsh-hosts组上运行播放,并在vms组中循环使用以下条件:

代码语言:javascript
复制
- 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

代码语言:javascript
复制
- hosts: vms
  gather_facts: no
  tasks:
    - ping:
      delegate_to: "{{hypervisor}}"

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

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

如果在此基础上根本没有任何需要与VM联系的场景,那么甚至可以通过在目录中设置ansible_ssh_host来让ansible在VM上运行游戏时始终与虚拟机管理程序联系:

代码语言:javascript
复制
[vms]
vm1 ansible_ssh_host=host1

这为您节省了已修复的delegate_to行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25857060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档