From eb0ada3d288cd7a8e3282770c30bc91f920ea8ae Mon Sep 17 00:00:00 2001 From: biancalana Date: Thu, 13 Nov 2025 14:18:00 +0000 Subject: [PATCH] Feature/improve bhyve guest and host detection (#85767) --- .../85767-ansible-virtualization-freebsd.yml | 2 ++ lib/ansible/module_utils/facts/virtual/freebsd.py | 15 +++++++++++++-- lib/ansible/module_utils/facts/virtual/linux.py | 6 ++++++ lib/ansible/module_utils/facts/virtual/sunos.py | 4 ++++ lib/ansible/module_utils/facts/virtual/sysctl.py | 6 ++++++ 5 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 changelogs/fragments/85767-ansible-virtualization-freebsd.yml diff --git a/changelogs/fragments/85767-ansible-virtualization-freebsd.yml b/changelogs/fragments/85767-ansible-virtualization-freebsd.yml new file mode 100644 index 00000000000..3fb116849f5 --- /dev/null +++ b/changelogs/fragments/85767-ansible-virtualization-freebsd.yml @@ -0,0 +1,2 @@ +bugfixes: + - ansible_virtualization_role and ansible_virtualization_type facts - fix the detection of vms running inside FreeBSD Bhyve hypervisor and detection of jails (https://github.com/ansible/ansible/pull/85767) \ No newline at end of file diff --git a/lib/ansible/module_utils/facts/virtual/freebsd.py b/lib/ansible/module_utils/facts/virtual/freebsd.py index 819aa029ddc..8801c9b140c 100644 --- a/lib/ansible/module_utils/facts/virtual/freebsd.py +++ b/lib/ansible/module_utils/facts/virtual/freebsd.py @@ -56,10 +56,11 @@ class FreeBSDVirtual(Virtual, VirtualSysctlDetectionMixin): host_tech.update(sec_jail_jailed['virtualization_tech_host']) if virtual_facts['virtualization_type'] == '': - sysctl = kern_vm_guest or hw_hv_vendor or sec_jail_jailed # We call update here, then re-set virtualization_tech_host/guest # later. - virtual_facts.update(sysctl) + for sysctl in [kern_vm_guest, hw_hv_vendor, sec_jail_jailed]: + if sysctl: + virtual_facts.update(sysctl) virtual_vendor_facts = self.detect_virt_vendor('hw.model') guest_tech.update(virtual_vendor_facts['virtualization_tech_guest']) @@ -68,6 +69,16 @@ class FreeBSDVirtual(Virtual, VirtualSysctlDetectionMixin): if virtual_facts['virtualization_type'] == '': virtual_facts.update(virtual_vendor_facts) + # if vmm.ko kernel module is loaded + kldstat_bin = self.module.get_bin_path('kldstat') + + if kldstat_bin is not None: + (rc, out, err) = self.module.run_command('%s -q -m vmm' % kldstat_bin) + if rc == 0: + host_tech.add('bhyve') + virtual_facts['virtualization_type'] = 'bhyve' + virtual_facts['virtualization_role'] = 'host' + virtual_facts['virtualization_tech_guest'] = guest_tech virtual_facts['virtualization_tech_host'] = host_tech return virtual_facts diff --git a/lib/ansible/module_utils/facts/virtual/linux.py b/lib/ansible/module_utils/facts/virtual/linux.py index db1195efc8f..d610b6fd4bc 100644 --- a/lib/ansible/module_utils/facts/virtual/linux.py +++ b/lib/ansible/module_utils/facts/virtual/linux.py @@ -187,6 +187,12 @@ class LinuxVirtual(Virtual): virtual_facts['virtualization_type'] = 'openstack' found_virt = True + if product_name == 'BHYVE': + guest_tech.add('bhyve') + if not found_virt: + virtual_facts['virtualization_type'] = 'bhyve' + found_virt = True + bios_vendor = get_file_content('/sys/devices/virtual/dmi/id/bios_vendor') if bios_vendor == 'Xen': diff --git a/lib/ansible/module_utils/facts/virtual/sunos.py b/lib/ansible/module_utils/facts/virtual/sunos.py index 6c6ffb291a1..d52949c0f02 100644 --- a/lib/ansible/module_utils/facts/virtual/sunos.py +++ b/lib/ansible/module_utils/facts/virtual/sunos.py @@ -115,6 +115,10 @@ class SunOSVirtual(Virtual): guest_tech.add('kvm') virtual_facts['virtualization_type'] = 'kvm' virtual_facts['virtualization_role'] = 'guest' + elif 'BHYVE' in line: + guest_tech.add('bhyve') + virtual_facts['virtualization_type'] = 'bhyve' + virtual_facts['virtualization_role'] = 'guest' virtual_facts['virtualization_tech_guest'] = guest_tech virtual_facts['virtualization_tech_host'] = host_tech diff --git a/lib/ansible/module_utils/facts/virtual/sysctl.py b/lib/ansible/module_utils/facts/virtual/sysctl.py index 6bf1d74d661..3181d48003b 100644 --- a/lib/ansible/module_utils/facts/virtual/sysctl.py +++ b/lib/ansible/module_utils/facts/virtual/sysctl.py @@ -65,6 +65,12 @@ class VirtualSysctlDetectionMixin: virtual_product_facts['virtualization_type'] = 'RHEV' virtual_product_facts['virtualization_role'] = 'guest' found_virt = True + if out.rstrip() == 'bhyve': + guest_tech.add('bhyve') + if not found_virt: + virtual_product_facts['virtualization_type'] = 'bhyve' + virtual_product_facts['virtualization_role'] = 'guest' + found_virt = True if (key == 'security.jail.jailed') and (out.rstrip() == '1'): guest_tech.add('jails') if not found_virt: