From b4f338bca738cbd3e3b64be2fc9579bcefa28d6e Mon Sep 17 00:00:00 2001 From: Patrik Lundin Date: Fri, 26 Aug 2016 17:27:41 +0200 Subject: [PATCH] Add OpenBSD virtualization facts. (#17227) * Add OpenBSD virtualization facts. Patch written by @jasperla. Tested by various people on: - virtualbox - vmware esx(i) + fusion - kvm (smartos + plain linux + a random cloud provider) This patch is already present in the OpenBSD port of ansible. * Rework diff to get rid of extra returns. Requested by @bcoca. While here, use four-space indentations of all code blocks. * Set facts even if no match is found. Discussed with @bcoca. * Find sysctl via get_bin_path(). Requested by @bcoca. * Fail if we do not find a sysctl binary. * Do not fail if a sysctl binary is not found. Just set empty fact values instead. Requested by @bcoca. --- lib/ansible/module_utils/facts.py | 45 +++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/lib/ansible/module_utils/facts.py b/lib/ansible/module_utils/facts.py index 78c460756d..652aa12a5d 100644 --- a/lib/ansible/module_utils/facts.py +++ b/lib/ansible/module_utils/facts.py @@ -3171,8 +3171,49 @@ class OpenBSDVirtual(Virtual): return self.facts def get_virtual_facts(self): - self.facts['virtualization_type'] = '' - self.facts['virtualization_role'] = '' + sysctl_path = self.module.get_bin_path('sysctl') + + if sysctl_path: + rc, out, err = self.module.run_command("%s -n hw.product" % sysctl_path) + if rc != 0: + self.facts['virtualization_type'] = '' + self.facts['virtualization_role'] = '' + elif re.match('(KVM|Bochs|SmartDC).*', out): + self.facts['virtualization_type'] = 'kvm' + self.facts['virtualization_role'] = 'guest' + elif re.match('.*VMware.*', out): + self.facts['virtualization_type'] = 'VMware' + self.facts['virtualization_role'] = 'guest' + elif out.rstrip() == 'VirtualBox': + self.facts['virtualization_type'] = 'virtualbox' + self.facts['virtualization_role'] = 'guest' + elif out.rstrip() == 'HVM domU': + self.facts['virtualization_type'] = 'xen' + self.facts['virtualization_role'] = 'guest' + elif out.rstrip() == 'Parallels': + self.facts['virtualization_type'] = 'parallels' + self.facts['virtualization_role'] = 'guest' + elif out.rstrip() == 'RHEV Hypervisor': + self.facts['virtualization_type'] = 'RHEV' + self.facts['virtualization_role'] = 'guest' + else: + # Try harder and see if hw.vendor has anything we could use. + rc, out, err = self.module.run_command("%s -n hw.vendor" % sysctl_path) + if rc != 0: + self.facts['virtualization_type'] = '' + self.facts['virtualization_role'] = '' + elif out.rstrip() == 'QEMU': + self.facts['virtualization_type'] = 'kvm' + self.facts['virtualization_role'] = 'guest' + else: + # Set empty values if we find no match at all. + self.facts['virtualization_type'] = '' + self.facts['virtualization_role'] = '' + else: + # Set empty values if we find no sysctl binary. + self.facts['virtualization_type'] = '' + self.facts['virtualization_role'] = '' + class HPUXVirtual(Virtual): """