diff --git a/changelogs/fragments/openstack_inventory-optional-region.yaml b/changelogs/fragments/openstack_inventory-optional-region.yaml new file mode 100644 index 00000000000..210145e1969 --- /dev/null +++ b/changelogs/fragments/openstack_inventory-optional-region.yaml @@ -0,0 +1,8 @@ +--- +bugfixes: + - openstack_inventory.py dynamic inventory file + fixed the plugin to the script so that it will work with current + ansible-inventory. + Also redirect stdout before dumping the ouptput, because not doing + so will cause JSON parse errors in some cases. + (https://github.com/ansible/ansible/pull/43432) diff --git a/contrib/inventory/openstack_inventory.py b/contrib/inventory/openstack_inventory.py index 1bb5e17de95..81237a7bf22 100755 --- a/contrib/inventory/openstack_inventory.py +++ b/contrib/inventory/openstack_inventory.py @@ -57,6 +57,7 @@ import os import sys import time from distutils.version import StrictVersion +from io import StringIO try: import json @@ -81,7 +82,8 @@ def get_groups_from_server(server_vars, namegroup=True): groups.append(cloud) # Create a group on region - groups.append(region) + if region: + groups.append(region) # And one by cloud_region groups.append("%s_%s" % (cloud, region)) @@ -235,6 +237,8 @@ def parse_args(): def main(): args = parse_args() try: + # openstacksdk library may write to stdout, so redirect this + sys.stdout = StringIO() config_files = cloud_config.CONFIG_FILES + CONFIG_FILES sdk.enable_logging(debug=args.debug) inventory_args = dict( @@ -255,6 +259,7 @@ def main(): inventory = sdk_inventory.OpenStackInventory(**inventory_args) + sys.stdout = sys.__stdout__ if args.list: output = get_host_groups(inventory, refresh=args.refresh, cloud=args.cloud) elif args.host: