Determine virtual or physical machine from existing default Ansible facts

Does anyone have a suggestion on how to detect whether a machine is a bare metal one or a virtual one using the existing Ansible facts? In Puppet there was a ‘physical’ boolean which could be used, but going through the Ansible facts of an example host here, I can’t quite figure out something I can use. Am I missing something? I could of course write my own fact, but I’d like to check here to see if that can be avoided.

Regards,
Simon

You have ansible_virtualization_role, host or guest.

If you would like to find out which hypervisor you can check the
ansible_virtualization_type.

Thanks for the reply, Kai. I did notice those variables, however they just list ‘NA’ for a simple desktop I have here. Anyway, thanks to your tip I had a quick browse through the facts source code, and if the machine was any type of guest, it seems it would definitely get picked up. So I think it’s fairly safe to say that ‘NA’ can be presumed to be a bare metal machine which solves my problem as far as I am concerned!

Sorry to hijack this topic, but I am having an issue and tried to post a topic earlier, but it’s not showing up.

If you read the information on top here
https://groups.google.com/forum/#!forum/ansible-project

you will see the following information
"(note: to avoid spam, initial posts to this group are moderated, but are approved pretty quickly)"

"pretty quickly" in this content can sometimes mean a few days unfortunately.

To list admin, do you need some help approving legitimate users?

I come into this one a bit late as I had this problem this week only.
I sometimes do not need roles or playbooks to run on virtual machines, so one way I found to work around the fact that ansible is missing puppet’s “is_virtual” fact is that put my physical machines in a specific group.

I would have an inventory looking like this:

[baremetal]
oslo
bergen

[builders]
rpmbuilder
debbuilder

[ci]
perforce:222

My playbook would include a role that’d play on each and every node in the inventory, but if I wanted to restrict it to non-virtual nodes, I’d add this line in my role tasks:

  • name: “Jetbrain’s products”
    tags:
  • jetbrains
    include: jetbrains.yaml
    when: ansible_hostname == ‘perforce’ or ansible_hostname in groups [‘baremetal’]

That does the trick for me, no need to register variables, or such.

Another way is to have multiple inventory files. This makes hosts management a bit more complicated, but also more flexible.

Regards,

– Jeff