Merge pull request #36 from maynero/master

Added Proxmox osinfo on host_vars, create group base on OS, and fix issue #34
This commit is contained in:
Xabi 2021-05-09 19:56:25 +02:00 committed by GitHub
commit bf00caf357
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 75 additions and 32 deletions

View File

@ -200,36 +200,7 @@ class ProxmoxAPI(object):
return True
except HTTPError as error:
return False
def qemu_ip_address(self, node, vm):
ip_address = None
networks = self.get('api2/json/nodes/{0}/qemu/{1}/agent/network-get-interfaces'.format(node, vm))['result']
if networks:
if type(networks) is dict:
for network in networks:
for ip_address in ['ip-address']:
try:
# IP address validation
if socket.inet_aton(ip_address):
# Ignore localhost
if ip_address != '127.0.0.1':
return ip_address
except socket.error:
pass
elif type(networks) is list:
for network in networks:
if 'ip-addresses' in network:
for ip_address in network['ip-addresses']:
try:
# IP address validation
if socket.inet_aton(ip_address['ip-address']):
# Ignore localhost
if ip_address['ip-address'] != '127.0.0.1':
return ip_address['ip-address']
except socket.error:
pass
return None
def openvz_ip_address(self, node, vm):
try:
config = self.get('api2/json/nodes/{0}/lxc/{1}/config'.format(node, vm))
@ -245,6 +216,63 @@ class ProxmoxAPI(object):
def version(self):
return ProxmoxVersion(self.get('api2/json/version'))
def qemu_agent_info(self, node, vm):
system_info = SystemInfo()
osinfo = self.get('api2/json/nodes/{0}/qemu/{1}/agent/get-osinfo'.format(node, vm))['result']
if osinfo:
if 'id' in osinfo:
system_info.id = osinfo['id']
if 'name' in osinfo:
system_info.name = osinfo['name']
if 'machine' in osinfo:
system_info.machine = osinfo['machine']
if 'kernel-release' in osinfo:
system_info.kernel = osinfo['kernel-release']
if 'version-id' in osinfo:
system_info.version_id = osinfo['version-id']
ip_address = None
networks = self.get('api2/json/nodes/{0}/qemu/{1}/agent/network-get-interfaces'.format(node, vm))['result']
if networks:
if type(networks) is dict:
for network in networks:
for ip_address in ['ip-address']:
try:
# IP address validation
if socket.inet_aton(ip_address):
# Ignore localhost
if ip_address != '127.0.0.1':
system_info.ip_address = ip_address
except socket.error:
pass
elif type(networks) is list:
for network in networks:
if 'ip-addresses' in network:
for ip_address in network['ip-addresses']:
try:
# IP address validation
if socket.inet_aton(ip_address['ip-address']):
# Ignore localhost
if ip_address['ip-address'] != '127.0.0.1':
system_info.ip_address = ip_address['ip-address']
except socket.error:
pass
return system_info
class SystemInfo(object):
id = ""
name = ""
machine = ""
kernel = ""
version_id = ""
ip_address = ""
def main_list(options, config_path):
results = {
@ -293,6 +321,7 @@ def main_list(options, config_path):
type = results['_meta']['hostvars'][vm]['proxmox_type']
except KeyError:
type = 'qemu'
results['_meta']['hostvars'][vm]['proxmox_type'] = 'qemu'
try:
description = proxmox_api.vm_description_by_type(node, vmid, type)['description']
except KeyError:
@ -308,9 +337,15 @@ def main_list(options, config_path):
}
if type == 'qemu':
# If Qemu Agent is enabled, try to guess the IP address
# Retrieve information from QEMU agent if installed
if proxmox_api.qemu_agent(node, vmid):
results['_meta']['hostvars'][vm]['ansible_host'] = proxmox_api.qemu_ip_address(node, vmid)
system_info = proxmox_api.qemu_agent_info(node, vmid)
results['_meta']['hostvars'][vm]['ansible_host'] = system_info.ip_address
results['_meta']['hostvars'][vm]['proxmox_os_id'] = system_info.id
results['_meta']['hostvars'][vm]['proxmox_os_name'] = system_info.name
results['_meta']['hostvars'][vm]['proxmox_os_machine'] = system_info.machine
results['_meta']['hostvars'][vm]['proxmox_os_kernel'] = system_info.kernel
results['_meta']['hostvars'][vm]['proxmox_os_version_id'] = system_info.version_id
else:
results['_meta']['hostvars'][vm]['ansible_host'] = proxmox_api.openvz_ip_address(node, vmid)
@ -333,6 +368,14 @@ def main_list(options, config_path):
}
results['running']['hosts'] += [vm]
if 'proxmox_os_id' in results['_meta']['hostvars'][vm]:
osid = results['_meta']['hostvars'][vm]['proxmox_os_id']
if osid not in results:
results[osid] = {
'hosts': []
}
results[osid]['hosts'] += [vm]
results['_meta']['hostvars'][vm].update(metadata)
# pools