From 2bd15b1bf7138be5f7c1a808a0c2af3f3e13975b Mon Sep 17 00:00:00 2001 From: Xabi Ezpeleta Date: Wed, 18 Dec 2019 21:36:43 +0100 Subject: [PATCH 1/4] Get IP address via Qemu Agent (KVM) --- proxmox.py | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/proxmox.py b/proxmox.py index 66cc9e2..43fa71c 100755 --- a/proxmox.py +++ b/proxmox.py @@ -33,6 +33,7 @@ except ImportError: import simplejson as json import os import sys +import socket from optparse import OptionParser from six import iteritems @@ -190,7 +191,32 @@ class ProxmoxAPI(object): def pool(self, poolid): return ProxmoxPool(self.get('api2/json/pools/{0}'.format(poolid))) - + + def qemu_agent(self, node, vm): + try: + info = self.get('api2/json/nodes/{0}/qemu/{1}/agent/info'.format(node, vm)) + if info is not None: + 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: + for network in networks: + for address in network['ip-addresses']: + ip_address = address['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 + return None + def version(self): return ProxmoxVersion(self.get('api2/json/version')) @@ -255,7 +281,11 @@ def main_list(options, config_path): metadata = { 'notes': description } - + + # If Qemu Agent is enabled, try to guess the IP address + if proxmox_api.qemu_agent(node, vmid): + results['_meta']['hostvars'][vm]['ansible_host'] = proxmox_api.qemu_ip_address(node, vmid) + if 'groups' in metadata: # print metadata for group in metadata['groups']: From e05f224c8c2473e7261d46bcc7d735c7a3729dff Mon Sep 17 00:00:00 2001 From: Xabi Ezpeleta Date: Wed, 18 Dec 2019 22:56:48 +0100 Subject: [PATCH 2/4] Get IP address from Proxmox (OpenVZ) --- proxmox.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/proxmox.py b/proxmox.py index 43fa71c..8079b9e 100755 --- a/proxmox.py +++ b/proxmox.py @@ -34,6 +34,7 @@ except ImportError: import os import sys import socket +import re from optparse import OptionParser from six import iteritems @@ -217,6 +218,18 @@ class ProxmoxAPI(object): pass return None + def openvz_ip_address(self, node, vm): + try: + config = self.get('api2/json/nodes/{0}/lxc/{1}/config'.format(node, vm)) + except HTTPError: + return False + + try: + ip_address = re.search('ip=(\d*\.\d*\.\d*\.\d*)', config['net0']).group(1) + return ip_address + except: + return False + def version(self): return ProxmoxVersion(self.get('api2/json/version')) @@ -282,9 +295,12 @@ def main_list(options, config_path): 'notes': description } - # If Qemu Agent is enabled, try to guess the IP address - if proxmox_api.qemu_agent(node, vmid): - results['_meta']['hostvars'][vm]['ansible_host'] = proxmox_api.qemu_ip_address(node, vmid) + if type == 'qemu': + # If Qemu Agent is enabled, try to guess the IP address + if proxmox_api.qemu_agent(node, vmid): + results['_meta']['hostvars'][vm]['ansible_host'] = proxmox_api.qemu_ip_address(node, vmid) + else: + results['_meta']['hostvars'][vm]['ansible_host'] = proxmox_api.openvz_ip_address(node, vmid) if 'groups' in metadata: # print metadata From 02cce4d56770d6901702532b4fd972e2527a337c Mon Sep 17 00:00:00 2001 From: Xabi Ezpeleta Date: Mon, 3 Feb 2020 12:08:50 +0100 Subject: [PATCH 3/4] Add error handling Check network is a valid object --- proxmox.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/proxmox.py b/proxmox.py index 8079b9e..d22e281 100755 --- a/proxmox.py +++ b/proxmox.py @@ -205,17 +205,18 @@ class ProxmoxAPI(object): ip_address = None networks = self.get('api2/json/nodes/{0}/qemu/{1}/agent/network-get-interfaces'.format(node, vm))['result'] if networks: - for network in networks: - for address in network['ip-addresses']: - ip_address = address['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 + if type(network) is dict: + for network in networks: + for address in network['ip-addresses']: + ip_address = address['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 return None def openvz_ip_address(self, node, vm): From 3eef05088ad21e50354913c97cb1b764f07b0909 Mon Sep 17 00:00:00 2001 From: Xabi Ezpeleta Date: Mon, 3 Feb 2020 12:11:41 +0100 Subject: [PATCH 4/4] Update changelog --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d566c48..d9e058a 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ Resolvable VM names: the inventory script collects the VM names (and not IP addr - Handle cases where node is unavailable (@andor44) [#7] - Fix python 2 and 3 compatibility (@gardar) [#14] - Filter on qemu and lxc resources only (@adubreuiltk) [#16] +- Get the IP address automatically (@xezpeleta) [#8] ## Instructions