virt module VMNotFound

129 views
Skip to first unread message

Moreno Garcia

unread,
Nov 17, 2017, 5:55:01 AM11/17/17
to Ansible Project
I have 3 machines provisioned on KVM. Here is my inventory:

[local]
localhost ansible_connection
=local


[dbservers]
server1
server2
server3


When I run from the command line: 

$ ansible localhost -m virt -a "name=scylla3 command=status"

localhost | SUCCESS => {
   
"changed": false,
   
"failed": false,
   
"status": "running"
}

It works perfectly fine.

But from my playbook

 - hosts: dbservers
   tasks
:
     
- name: Test command for VMs
        virt
:
          command
: status
          name
: '{{ansible_host }}'

I get the following error:
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: VMNotFound: virtual machine server1 not found
fatal
: [server1]: FAILED! => {"changed": false, "failed": true, "msg": "virtual machine server1 not found"}
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: VMNotFound: virtual machine server2 not found
fatal
: [server2]: FAILED! => {"changed": false, "failed": true, "msg": "virtual machine server2 not found"}
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: VMNotFound: virtual machine server3 not found
fatal
: [server3]: FAILED! => {"changed": false, "failed": true, "msg": "virtual machine server3 not found"}

Running with -vvv the relevant part:

The full traceback is:
Traceback (most recent call last):
 
File "/tmp/ansible_WuP4hq/ansible_module_virt.py", line 540, in main
    rc
, result = core(module)
 
File "/tmp/ansible_WuP4hq/ansible_module_virt.py", line 506, in core
    res
= getattr(v, command)(guest)
 
File "/tmp/ansible_WuP4hq/ansible_module_virt.py", line 410, in status
   
return self.conn.get_status(vmid)
 
File "/tmp/ansible_WuP4hq/ansible_module_virt.py", line 236, in get_status
    state
= self.find_vm(vmid).info()[0]
 
File "/tmp/ansible_WuP4hq/ansible_module_virt.py", line 205, in find_vm
   
raise VMNotFound("virtual machine %s not found" % vmid)
VMNotFound: virtual machine server3 not found


fatal
: [server3]: FAILED! => {
   
"changed": false,
   
"failed": true,
   
"invocation": {
       
"module_args": {
           
"autostart": null,
           
"command": "status",
           
"name": "server3",
           
"state": null,
           
"uri": "qemu:///system",
           
"xml": null
       
}
   
},
   
"msg": "virtual machine server3 not found"
}

Not sure what I'm doing wrong. Any help appreciated.





Moreno Garcia

unread,
Nov 17, 2017, 6:28:54 AM11/17/17
to Ansible Project
The command line is actually: $ ansible localhost -m virt -a "name=server3 command=status"

Moreno Garcia

unread,
Nov 17, 2017, 8:49:04 AM11/17/17
to Ansible Project
ansible --version
ansible
2.4.1.0
  config file
= /etc/ansible/ansible.cfg
  configured
module search path = [u'/home/bfranklin/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python
module location = /home/bfranklin/.local/lib/python2.7/site-packages/ansible
  executable location
= /usr/bin/ansible
  python version
= 2.7.13 (default, Jan 19 2017, 14:48:08) [GCC 6.3.0 20170118]/

Moreno Garcia

unread,
Nov 17, 2017, 4:16:17 PM11/17/17
to Ansible Project
I'm not a programmer but I decided to run some tests with the code.

VMs ON

Python 2.7.13 (default, Jan 19 2017, 14:48:08)
[GCC 6.3.0 20170118] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import libvirt
>>> print "VMs off"
VMs off
>>> conn = libvirt.open('qemu:///system')
>>> vms = []
>>> ids = conn.listDomainsID()
>>> ids
[]
>>> domains = conn.listDefinedDomains()
>>> domains
['server3', 'server2', 'server1']
>>> for id in ids:
...     vm = conn.lookupByID(id)
...     vms.append(vm)
...
>>> vms
[]
>>> for domain in domains:
...     vm = conn.lookupByName(domain)
...     vms.append(vm)
...
>>> vms
[<libvirt.virDomain object at 0x7fe15b71f690>, <libvirt.virDomain object at 0x7fe15b71f6d0>, <libvirt.virDomain object at 0x7fe15b71f710>]
>>> vms[0].name()
'server3'
>>> vms[1].name()
'server2'
>>> vms[2].name()
'server1'

VMs OFF

>>> print 'VMs on'
VMs on
>>> ids = conn.listDomainsID()
>>> ids
[95, 94, 93]
>>> for id in ids:
...     vm = conn.lookupByID(id)
...     vms.append(vm)
...
>>> vms
[<libvirt.virDomain object at 0x7fe15b71f690>, <libvirt.virDomain object at 0x7fe15b71f6d0>, <libvirt.virDomain object at 0x7fe15b71f710>, <libvirt.virDomain object at 0x7fe15b71f650>, <libvirt.virDomain object at 0x7fe15b71f790>, <libvirt.virDomain object at 0x7fe15b71f7d0>]
>>> vms[0].name()
'server3'
>>> vms[1].name()
'server2'
>>> vms[2].name()
'server1'
>>> domains = conn.listDefinedDomains()
>>> domains
[]
>>> for domain in domains:
...     vm = conn.lookupByName(domain)
...     vms.append(vm)
...
>>> domains
[]
>>>



 
def find_vm(self, vmid):
 
"""
 Extra bonus feature: vmid = -1 returns a list of everything
 """

 conn
= self.conn
 
 vms
= []
 
 
# this block of code borrowed from virt-manager:
 
# get working domain's name
 ids
= conn.listDomainsID()
 
for id in ids:
 vm
= conn.lookupByID(id)
 vms
.append(vm)
 
# get defined domain
 names
= conn.listDefinedDomains()
 
for name in names:
 vm
= conn.lookupByName(name)
 vms
.append(vm)
 
 
if vmid == -1:
 
return vms
 
 
for vm in vms:
 
if vm.name() == vmid:
 
return vm
 
 
raise VMNotFound("virtual machine %s not found" % vmid)

It should find the VM by vmid. I'm puzzled.

Kai Stian Olstad

unread,
Nov 17, 2017, 4:24:16 PM11/17/17
to ansible...@googlegroups.com
On Friday, 17 November 2017 11.55.01 CET Moreno Garcia wrote:
> I have 3 machines provisioned on KVM. Here is my inventory:
>
> [local]
> localhost ansible_connection=local
>
>
> [dbservers]
> server1
> server2
> server3
>
>
> When I run from the command line:
>
> $ ansible localhost -m virt -a "name=scylla3 command=status"
>
> localhost | SUCCESS => {
> "changed": false,
> "failed": false,
> "status": "running"
> }
>
> It works perfectly fine.

Here the virt module is running on localhost.


> But from my playbook
>
> - hosts: dbservers
> tasks:
> - name: Test command for VMs
> virt:
> command: status
> name: '{{ansible_host }}'
>
> I get the following error:
> An exception occurred during task execution. To see the full traceback, use
> -vvv. The error was: VMNotFound: virtual machine server1 not found
> fatal: [server1]: FAILED! => {"changed": false, "failed": true, "msg": "virtual
> machine server1 not found"}
> An exception occurred during task execution. To see the full traceback, use
> -vvv. The error was: VMNotFound: virtual machine server2 not found
> fatal: [server2]: FAILED! => {"changed": false, "failed": true, "msg": "virtual
> machine server2 not found"}
> An exception occurred during task execution. To see the full traceback, use
> -vvv. The error was: VMNotFound: virtual machine server3 not found
> fatal: [server3]: FAILED! => {"changed": false, "failed": true, "msg": "virtual
> machine server3 not found"}

Here you are running the virt module on the VM, and the VM is not running KVM the host is.


> Running with -vvv the relevant part:
>
> The full traceback is:
> Traceback (most recent call last):
> File "/tmp/ansible_WuP4hq/ansible_module_virt.py", line 540, in main
> rc, result = core(module)
> File "/tmp/ansible_WuP4hq/ansible_module_virt.py", line 506, in core
> res = getattr(v, command)(guest)
> File "/tmp/ansible_WuP4hq/ansible_module_virt.py", line 410, in status
> return self.conn.get_status(vmid)
> File "/tmp/ansible_WuP4hq/ansible_module_virt.py", line 236, in get_status
> state = self.find_vm(vmid).info()[0]
> File "/tmp/ansible_WuP4hq/ansible_module_virt.py", line 205, in find_vm
> raise VMNotFound("virtual machine %s not found" % vmid)
> VMNotFound: virtual machine server3 not found
>
>
> fatal: [server3]: FAILED! => {

This last line say you are running on server3 an not localhost.


> "changed": false,
> "failed": true,
> "invocation": {
> "module_args": {
> "autostart": null,
> "command": "status",
> "name": "server3",
> "state": null,
> "uri": "qemu:///system",
> "xml": null
> }
> },
> "msg": "virtual machine server3 not found"
> }
>
> Not sure what I'm doing wrong. Any help appreciated.

You need to add delegate_to: localhost or set connection: local


--
Kai Stian Olstad

Moreno Garcia

unread,
Nov 17, 2017, 5:15:51 PM11/17/17
to Ansible Project
Kai, thanks a lot for taking the time to reply.

Tried with delegate_to

"msg": "Unsupported parameters for (virt) module: delegate_to Supported parameters include: autostart,command,name,state,uri,xml"

I already tried with localhost on the playbook, let me try again.

Changing the name to localhost:

 - hosts: dbservers
   tasks
:

     
- name: Test command for VMs
        virt
:
          command
:
status
          name
: localhost


<server3> (0, '\r\n{"msg": "virtual machine localhost not found", "failed": true, "exception": "Traceback (most recent call last):\\n  File \\"/tmp/ansible_mQLcdU/ansible_module_virt.py\\", line 540, in main\\n    rc, result = core(module)\\n  File \\"/tmp/ansible_mQLcdU/ansible_module_virt.py\\", line 506, in core\\n    res = getattr(v, command)(guest)\\n  File \\"/tmp/ansible_mQLcdU/ansible_module_virt.py\\", line 410, in status\\n    return self.conn.get_status(vmid)\\n  File \\"/tmp/ansible_mQLcdU/ansible_module_virt.py\\", line 236, in get_status\\n    state = self.find_vm(vmid).info()[0]\\n  File \\"/tmp/ansible_mQLcdU/ansible_module_virt.py\\", line 205, in find_vm\\n    raise VMNotFound(\\"virtual machine %s not found\\" % vmid)\\nVMNotFound: virtual machine localhost not found\\n", "invocation": {"module_args": {"xml": null, "name": "localhost", "uri": "qemu:///system", "state": null, "command": "status", "autostart": null}}}\r\n', 'Shared connection to server3 closed.\r\n')

The full traceback is:
Traceback (most recent call last):
  File "/tmp/ansible_mQLcdU/ansible_module_virt.py", line 540, in main
    rc, result = core(module)
  File "/tmp/ansible_mQLcdU/ansible_module_virt.py", line 506, in core
    res = getattr(v, command)(guest)
  File "/tmp/ansible_mQLcdU/ansible_module_virt.py", line 410, in status
    return self.conn.get_status(vmid)
  File "/tmp/ansible_mQLcdU/ansible_module_virt.py", line 236, in get_status
    state = self.find_vm(vmid).info()[0]
  File "/tmp/ansible_mQLcdU/ansible_module_virt.py", line 205, in find_vm

    raise VMNotFound("virtual machine %s not found" % vmid)
VMNotFound: virtual machine localhost not found



fatal: [server3]: FAILED! => {
    "changed": false,
    "failed": true,
    "invocation": {
        "module_args": {
            "autostart": null,
            "command": "status",
            "name": "localhost",
            "state": null,
            "uri": "qemu:///system",
            "xml": null
        }
    },
    "msg": "virtual machine localhost not found"


Changing hosts and removing name:


 
- hosts: local

   tasks
:
     
- name: Test command for VMs
        virt
:
          command
: status


TASK
[Test command for VMs] *****************************************************************************************************************************************************************************************
task path
: /home/bfranklin/bin/test.test/tasks/test3.yml:20
Using module file /home/bfranklin/.local/lib/python2.7/site-packages/ansible/modules/cloud/misc/virt.py
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: bfranklin
<localhost> EXEC /bin/sh -c 'echo ~ && sleep 0'
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /home/bfranklin/.ansible/tmp/ansible-tmp-1510956849.89-176724624375677 `" && echo ansible-tmp-1510956849.89-176724624375677="` echo /home/bfranklin/.ansible/tmp/ansible-tmp-1510956849.89-176724624375677 `" ) && sleep 0'
<localhost> PUT /tmp/tmpgNSjwP TO /home/bfranklin/.ansible/tmp/ansible-tmp-1510956849.89-176724624375677/virt.py
<localhost> EXEC /bin/sh -c 'chmod u+x /home/bfranklin/.ansible/tmp/ansible-tmp-1510956849.89-176724624375677/ /home/bfranklin/.ansible/tmp/ansible-tmp-1510956849.89-176724624375677/virt.py && sleep 0'
<localhost> EXEC /bin/sh -c '/usr/bin/python /home/bfranklin/.ansible/tmp/ansible-tmp-1510956849.89-176724624375677/virt.py; rm -rf "/home/bfranklin/.ansible/tmp/ansible-tmp-1510956849.89-176724624375677/" > /dev/null 2>&1 && sleep 0'
fatal
: [localhost]: FAILED! => {
   
"changed": false,
   
"failed": true,
   
"invocation": {

       
"module_args": {
           
"autostart": null,
           
"command": "status",

           
"name": null,
           
"state": null,
           
"uri": "qemu:///system",
           
"xml": null
       
}
   
},
   
"msg": "status requires 1 argument: guest"

It seem to "work" but then how to iterate through my list of guests?

Kai Stian Olstad

unread,
Nov 17, 2017, 5:24:44 PM11/17/17
to ansible...@googlegroups.com
On Friday, 17 November 2017 23.15.51 CET Moreno Garcia wrote:
> Kai, thanks a lot for taking the time to reply.
>
> Tried with delegate_to
>
> "msg": "Unsupported parameters for (virt) module: delegate_to Supported
> parameters include: autostart,command,name,state,uri,xml"

Your indentation was wrong, it should be on the same level as virt, not under virt.


> I already tried with localhost on the playbook, let me try again.
>
> Changing the name to localhost:
>
> - hosts: dbservers
> tasks:
>
> - name: Test command for VMs
> virt:
> command: status
> name: localhost

With delegate_to:

- hosts: dbservers
tasks:
- name: Test command for VMs
virt:
command: status
name: {{ inventory_hostname }}
delegate_to: localhost


With connection: local
- hosts: dbservers
connection: local
tasks:
- name: Test command for VMs
virt:
command: status
name: {{ inventory_hostname }}


--
Kai Stian Olstad

Moreno Garcia

unread,
Nov 17, 2017, 5:34:01 PM11/17/17
to Ansible Project
It worked like a charm. Thanks a lot Kai! 
Reply all
Reply to author
Forward
0 new messages