summaryrefslogtreecommitdiff
path: root/contrib/inventory/openstack.py
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/inventory/openstack.py')
-rwxr-xr-xcontrib/inventory/openstack.py67
1 files changed, 53 insertions, 14 deletions
diff --git a/contrib/inventory/openstack.py b/contrib/inventory/openstack.py
index 46b43e9221..b82a042c29 100755
--- a/contrib/inventory/openstack.py
+++ b/contrib/inventory/openstack.py
@@ -32,6 +32,13 @@
# all of them and present them as one contiguous inventory.
#
# See the adjacent openstack.yml file for an example config file
+# There are two ansible inventory specific options that can be set in
+# the inventory section.
+# expand_hostvars controls whether or not the inventory will make extra API
+# calls to fill out additional information about each server
+# use_hostnames changes the behavior from registering every host with its UUID
+# and making a group of its hostname to only doing this if the
+# hostname in question has more than one server
import argparse
import collections
@@ -51,7 +58,7 @@ import shade.inventory
CONFIG_FILES = ['/etc/ansible/openstack.yaml']
-def get_groups_from_server(server_vars):
+def get_groups_from_server(server_vars, namegroup=True):
groups = []
region = server_vars['region']
@@ -76,7 +83,8 @@ def get_groups_from_server(server_vars):
groups.append(extra_group)
groups.append('instance-%s' % server_vars['id'])
- groups.append(server_vars['name'])
+ if namegroup:
+ groups.append(server_vars['name'])
for key in ('flavor', 'image'):
if 'name' in server_vars[key]:
@@ -94,9 +102,9 @@ def get_groups_from_server(server_vars):
return groups
-def get_host_groups(inventory):
+def get_host_groups(inventory, refresh=False):
(cache_file, cache_expiration_time) = get_cache_settings()
- if is_cache_stale(cache_file, cache_expiration_time):
+ if is_cache_stale(cache_file, cache_expiration_time, refresh=refresh):
groups = to_json(get_host_groups_from_cloud(inventory))
open(cache_file, 'w').write(groups)
else:
@@ -106,23 +114,44 @@ def get_host_groups(inventory):
def get_host_groups_from_cloud(inventory):
groups = collections.defaultdict(list)
+ firstpass = collections.defaultdict(list)
hostvars = {}
- for server in inventory.list_hosts():
+ list_args = {}
+ if hasattr(inventory, 'extra_config'):
+ use_hostnames = inventory.extra_config['use_hostnames']
+ list_args['expand'] = inventory.extra_config['expand_hostvars']
+ else:
+ use_hostnames = False
+
+ for server in inventory.list_hosts(**list_args):
if 'interface_ip' not in server:
continue
- for group in get_groups_from_server(server):
- groups[group].append(server['id'])
- hostvars[server['id']] = dict(
- ansible_ssh_host=server['interface_ip'],
- openstack=server,
- )
+ firstpass[server['name']].append(server)
+ for name, servers in firstpass.items():
+ if len(servers) == 1 and use_hostnames:
+ server = servers[0]
+ hostvars[name] = dict(
+ ansible_ssh_host=server['interface_ip'],
+ openstack=server)
+ for group in get_groups_from_server(server, namegroup=False):
+ groups[group].append(server['name'])
+ else:
+ for server in servers:
+ server_id = server['id']
+ hostvars[server_id] = dict(
+ ansible_ssh_host=server['interface_ip'],
+ openstack=server)
+ for group in get_groups_from_server(server, namegroup=True):
+ groups[group].append(server_id)
groups['_meta'] = {'hostvars': hostvars}
return groups
-def is_cache_stale(cache_file, cache_expiration_time):
+def is_cache_stale(cache_file, cache_expiration_time, refresh=False):
''' Determines if cache file has expired, or if it is still valid '''
+ if refresh:
+ return True
if os.path.isfile(cache_file):
mod_time = os.path.getmtime(cache_file)
current_time = time.time()
@@ -169,14 +198,24 @@ def main():
try:
config_files = os_client_config.config.CONFIG_FILES + CONFIG_FILES
shade.simple_logging(debug=args.debug)
- inventory = shade.inventory.OpenStackInventory(
+ inventory_args = dict(
refresh=args.refresh,
config_files=config_files,
private=args.private,
)
+ if hasattr(shade.inventory.OpenStackInventory, 'extra_config'):
+ inventory_args.update(dict(
+ config_key='ansible',
+ config_defaults={
+ 'use_hostnames': False,
+ 'expand_hostvars': True,
+ }
+ ))
+
+ inventory = shade.inventory.OpenStackInventory(**inventory_args)
if args.list:
- output = get_host_groups(inventory)
+ output = get_host_groups(inventory, refresh=args.refresh)
elif args.host:
output = to_json(inventory.get_host(args.host))
print(output)