VM 对使用 ansible shell 任务执行的 virsh 命令不可见
VM's are not Visible to virsh command executed using ansible shell task
我试图在关闭主机之前保存所有 运行 虚拟机的状态。
virsh save <domain-name> <filetosave>
我的想法是在我再次带回主机时恢复 VM。
我正在使用 ansible virt 模块来确定 运行 虚拟机。没有可用于使用 virt 模块保存虚拟机的命令,因此使用 shell 模块,如下所示
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
输出:
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 命令,但得到了空白结果
$ ansible -i ../hosts.ini RIG3600 -m shell -a "virsh list --all"
192.168.0.113 | CHANGED | rc=0 >>
Id Name State
--------------------
相同的命令在 Linux shell
中运行良好
$ 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
不确定我是否遗漏了什么,非常感谢任何帮助。
virt
模块,as documented,默认使用 libvirt URI qemu:///system
。
virsh
命令,另一方面,当运行作为非root用户时,默认为qemu:///session
。
换句话说,您的 virsh
命令与您的 virt
任务不在同一个 libvirt 实例上对话。
您可以使用 -c
(--connect
) 选项为 virsh
命令提供明确的 URI:
virsh -c qemu:///system ...
或者通过设置 LIBVIRT_DEFAULT_URI
环境变量:
- 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
(你也可以在游戏中设置environment
,而不是在单个任务中设置)。
我试图在关闭主机之前保存所有 运行 虚拟机的状态。
virsh save <domain-name> <filetosave>
我的想法是在我再次带回主机时恢复 VM。
我正在使用 ansible virt 模块来确定 运行 虚拟机。没有可用于使用 virt 模块保存虚拟机的命令,因此使用 shell 模块,如下所示
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
输出:
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 命令,但得到了空白结果
$ ansible -i ../hosts.ini RIG3600 -m shell -a "virsh list --all"
192.168.0.113 | CHANGED | rc=0 >>
Id Name State
--------------------
相同的命令在 Linux shell
中运行良好$ 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 不确定我是否遗漏了什么,非常感谢任何帮助。
virt
模块,as documented,默认使用 libvirt URI qemu:///system
。
virsh
命令,另一方面,当运行作为非root用户时,默认为qemu:///session
。
换句话说,您的 virsh
命令与您的 virt
任务不在同一个 libvirt 实例上对话。
您可以使用 -c
(--connect
) 选项为 virsh
命令提供明确的 URI:
virsh -c qemu:///system ...
或者通过设置 LIBVIRT_DEFAULT_URI
环境变量:
- 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
(你也可以在游戏中设置environment
,而不是在单个任务中设置)。