diff --git a/contrib/inventory_builder/inventory.py b/contrib/inventory_builder/inventory.py index d030d3a22..50096ee05 100644 --- a/contrib/inventory_builder/inventory.py +++ b/contrib/inventory_builder/inventory.py @@ -20,6 +20,8 @@ # Add range of hosts: inventory.py 10.10.1.3-10.10.1.5 # Add hosts with different ip and access ip: # inventory.py 10.0.0.1,192.168.10.1 10.0.0.2,192.168.10.2 10.0.0.3,192.168.1.3 +# Add hosts with a specific hostname, ip, and optional access ip: +# inventory.py first,10.0.0.1,192.168.10.1 second,10.0.0.2 last,10.0.0.3 # Delete a host: inventory.py -10.10.1.3 # Delete a host by id: inventory.py -node1 # @@ -44,7 +46,8 @@ import sys ROLES = ['all', 'kube-master', 'kube-node', 'etcd', 'k8s-cluster', 'calico-rr'] PROTECTED_NAMES = ROLES -AVAILABLE_COMMANDS = ['help', 'print_cfg', 'print_ips', 'print_hostnames', 'load'] +AVAILABLE_COMMANDS = ['help', 'print_cfg', 'print_ips', 'print_hostnames', + 'load'] _boolean_states = {'1': True, 'yes': True, 'true': True, 'on': True, '0': False, 'no': False, 'false': False, 'off': False} yaml = YAML() @@ -79,7 +82,7 @@ class KubesprayInventory(object): try: self.hosts_file = open(config_file, 'r') self.yaml_config = yaml.load(self.hosts_file) - except FileNotFoundError: + except OSError: pass if changed_hosts and changed_hosts[0] in AVAILABLE_COMMANDS: @@ -194,8 +197,21 @@ class KubesprayInventory(object): 'ip': ip, 'access_ip': access_ip} elif host[0].isalpha(): - raise Exception("Adding hosts by hostname is not supported.") - + if ',' in host: + try: + hostname, ip, access_ip = host.split(',') + except Exception: + hostname, ip = host.split(',') + access_ip = ip + if self.exists_hostname(all_hosts, host): + self.debug("Skipping existing host {0}.".format(host)) + continue + elif self.exists_ip(all_hosts, ip): + self.debug("Skipping existing host {0}.".format(ip)) + continue + all_hosts[hostname] = {'ansible_host': access_ip, + 'ip': ip, + 'access_ip': access_ip} return all_hosts def range2ips(self, hosts): @@ -206,7 +222,7 @@ class KubesprayInventory(object): # Python 3.x start = int(ip_address(start_address)) end = int(ip_address(end_address)) - except: + except Exception: # Python 2.7 start = int(ip_address(unicode(start_address))) end = int(ip_address(unicode(end_address))) @@ -369,6 +385,7 @@ Advanced usage: Add another host after initial creation: inventory.py 10.10.1.5 Add range of hosts: inventory.py 10.10.1.3-10.10.1.5 Add hosts with different ip and access ip: inventory.py 10.0.0.1,192.168.10.1 10.0.0.2,192.168.10.2 10.0.0.3,192.168.10.3 +Add hosts with a specific hostname, ip, and optional access ip: first,10.0.0.1,192.168.10.1 second,10.0.0.2 last,10.0.0.3 Delete a host: inventory.py -10.10.1.3 Delete a host by id: inventory.py -node1 diff --git a/contrib/inventory_builder/tests/test_inventory.py b/contrib/inventory_builder/tests/test_inventory.py index c6d8d96f4..b0e14b809 100644 --- a/contrib/inventory_builder/tests/test_inventory.py +++ b/contrib/inventory_builder/tests/test_inventory.py @@ -22,7 +22,7 @@ path = "./contrib/inventory_builder/" if path not in sys.path: sys.path.append(path) -import inventory +import inventory # noqa class TestInventory(unittest.TestCase):