如何自动执行域 xml 更新/验证?

How can I automate domain xml update / verification?

提问人:philipp 提问时间:5/21/2023 最后编辑:philipp 更新时间:5/22/2023 访问量:129

问:

我想在基于虚拟机管理程序上自动执行域的备份过程。为了获得增量备份的能力,“域XML”需要包含:libvirt

  • 顶级命名空间声明属性和qemu
  • 元素qemu:capabilities / qemu:add

如图所示

<domain type='kvm' id='1' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  [..]
  <qemu:capabilities>
    <qemu:add capability='incremental-backup'/>
  </qemu:capabilities>
  [..]
 </domain>

从交互式 shell 执行此操作是没有问题的。

$ sudo virsh edit some-domain # that launches an interactive editor (vi/vim)
                              # containing the XML configuration 
                              # saving the result updates the domains
                              # XML

我的问题是,我不知何故不知道如何使用 ansible 实现自动化。为了检查/创建如上所示的那些属性/元素,我可以使用该模块,但是如何将其应用于由启动的交互式编辑器community.general.xmlvirsh edit …

我可以使用它来获取域的XML配置,检查和修改。但是如何设置/写入结果呢?virsh dumpxml …

更新

多亏了 @peter-krempa 的回答,最终的 ansible 代码现在看起来像这样:

# "{{ item }}" refers to the name of the domain / vm

- name: Read Domain XML
  community.libvirt.virt:
    command: get_xml
    name: "{{ item }}"
  register: vms_xml


- name: Add namespaced capability for incremental backups
  community.general.xml:
    xmlstring: "{{ vms_xml.get_xml }}"
    xpath: '/domain/qemu:capabilities/qemu:add'
    attribute: capability
    value: incremental-backup
    namespaces:
      qemu: 'http://libvirt.org/schemas/domain/qemu/1.0'
  register: vm_xml_with_inc

- name: Redefine Domain
  community.libvirt.virt:
    name: "{{ item }}"
    command: define
    xml: "{{ vm_xml_with_inc.xmlstring }}"
shell ansible libvirt

评论

1赞 U880D 5/21/2023
"但是如何设置/写入结果呢?根据修改正在运行的KVM域的XML定义,通过似乎是.参见 如何使用 virsh 创建持久域?virsh define

答:

1赞 Peter Krempa 5/22/2023 #1

要从已有的现有 XML 编写域定义(配置),请使用 。virsh define /path/to/def.xml

请注意,libvirt 未启用备份的原因是它太旧了,并且该功能当时尚未完成。在完成时,您不再需要指定标志。在这种情况下,如果要迁移 VM 或想要使用其他块作业或创建快照,则备份元数据可能会中断。

另请注意,libvirt 关于使用覆盖状态的文档:<qemu:add capability

Libvirt 提供了一个 XML 命名空间和一个可选的库 libvirt-qemu.so 专门用于处理 QEMU 的问题。使用时 正确地,这些扩展允许测试特定的 QEMU 功能 尚未移植到通用 libvirt XML 和 API 接口。但是,它们不受支持,因为库不受支持 保证具有稳定的 API,滥用库或 XML 可能会导致 在不一致的状态下,libvirtd 崩溃,并升级 qemu-kvm 或 libvirtd 可能会破坏依赖的域的行为 在特定于 QEMU 的直通上。如果您发现自己需要使用 他们访问特定的 qemu 功能,然后请将 RFE 发布到 libvirt 邮件列表,将该功能合并到 稳定的 libvirt XML 和 API 接口。

评论

0赞 philipp 5/22/2023
define正是这个伎俩。