首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚拟机对于使用ansible shell任务执行的virsh命令不可见

虚拟机对于使用ansible shell任务执行的virsh命令不可见
EN

Stack Overflow用户
提问于 2019-12-30 04:12:44
回答 1查看 1.1K关注 0票数 1

我正在尝试保存所有正在运行的虚拟机的状态,然后才能关闭主机。

代码语言:javascript
复制
virsh save <domain-name> <filetosave>

我的想法是在我再次带回主机时恢复虚拟机。

我正在使用ansible virt模块来确定正在运行的虚拟机。没有使用virt模块保存虚拟机的命令,因此使用如下所示的外壳模块

代码语言:javascript
复制
 tasks:

  - name: Gathering Facts
    setup:

  # Listing VMs
  - name: list all VMs
    virt:
      command: list_vms
    register: all_vms

  - name: list only running VMs
    virt:
      command: list_vms
      state: running
    register: running_vms

  - name: Print All VM'state
    debug:
      msg: |
        VM's: {{ all_vms.list_vms }},
        Active VM's: {{ running_vms.list_vms }}

  - name: Save Running VM's
    shell: >
      virsh save {{ item }} ~/.mykvm/{{item}}.save
    args:
      chdir: /home/sharu
      executable: /bin/bash
    loop:
      "{{ running_vms.list_vms }}"
    register: save_result
  - debug:
      var: save_result

输出:

代码语言:javascript
复制
TASK [list all VMs] 
*********
ok: [192.168.0.113]

TASK [list only running VMs] 
*********
ok: [192.168.0.113]

TASK [Print All VM'state] 
*********
ok: [192.168.0.113] => {
    "msg": "VM's: [u'win10-2', u'ubuntu18.04', u'ubuntu18.04-2', u'win10'],\nActive VM's: [u'win10-2']\n"
}

TASK [Save Running VM's] 
*********
failed: [192.168.0.113] (item=win10-2) => {"ansible_loop_var": "item", "changed": true, "cmd": "virsh save win10-2 ~/.mykvm/win10-2.save\n", "delta": "0:00:00.101916", "end": "2019-12-30 01:19:32.205584", "item": "win10-2", "msg": "non-zero return code", "rc": 1, "start": "2019-12-30 01:19:32.103668", "stderr": "error: failed to get domain 'win10-2'", "stderr_lines": ["error: failed to get domain 'win10-2'"], "stdout": "", "stdout_lines": []}

PLAY RECAP 
******************
192.168.0.113              : ok=5    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

请注意,virt模块能够获取有关正在运行的域(VM)的信息,但是shell命令无法获取域名。似乎虚拟机对于Ansible的shell任务是不可见的

为了进一步调试,我执行了下面的Ansible ad-hoc命令,但得到的结果为空

代码语言:javascript
复制
$ ansible -i ../hosts.ini RIG3600 -m shell -a "virsh list --all"
192.168.0.113 | CHANGED | rc=0 >>
 Id   Name   State
--------------------

同样的命令在Linux shell中也可以正常工作

代码语言:javascript
复制
$ virsh list --all

 Id   Name            State
--------------------------------
 3    win10-2         running
 -    ubuntu18.04     shut off
 -    ubuntu18.04-2   shut off
 -    win10           shut off

我使用的是Ansible版本2.8.3,我不确定我错过了什么,任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-30 10:52:46

virt模块as documented默认使用libvirt URI qemu:///system

另一方面,当以非根用户身份运行时,virsh命令缺省为qemu:///session

换句话说,您的virsh命令与您的virt任务不是与同一个libvirt实例对话。

您可以使用-c (--connect)选项为virsh命令提供显式URI:

代码语言:javascript
复制
virsh -c qemu:///system ...

或通过设置LIBVIRT_DEFAULT_URI环境变量:

代码语言:javascript
复制
  - name: Save Running VM's
    shell: >
      virsh save {{ item }} ~/.mykvm/{{item}}.save
    args:
      chdir: /home/sharu
      executable: /bin/bash
    environment:
      LIBVIRT_DEFAULT_URI: qemu:///system
    loop:
      "{{ running_vms.list_vms }}"
    register: save_result

(您也可以在play上设置environment,而不是在单个任务上设置)。

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

https://stackoverflow.com/questions/59522902

复制
相关文章

相似问题

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