diff --git a/awx/main/management/commands/inventory_import.py b/awx/main/management/commands/inventory_import.py index 51ef9fdf36..ec8da4dc64 100644 --- a/awx/main/management/commands/inventory_import.py +++ b/awx/main/management/commands/inventory_import.py @@ -357,8 +357,9 @@ class ExecutableJsonLoader(BaseLoader): stdout, stderr = proc.communicate() if proc.returncode != 0: raise RuntimeError('%r failed (rc=%d) with output: %s' % (cmd, proc.returncode, stderr)) - data = json.loads(stdout) - if not isinstance(data, dict): + try: + data = json.loads(stdout) + except ValueError: raise TypeError('Returned JSON must be a dictionary, got %s instead' % str(type(data))) except: logger.error('Failed to load JSON from: %s', stdout) diff --git a/awx/plugins/inventory/windows_azure.py b/awx/plugins/inventory/windows_azure.py index 8a53fadfa1..dede09d179 100755 --- a/awx/plugins/inventory/windows_azure.py +++ b/awx/plugins/inventory/windows_azure.py @@ -118,7 +118,7 @@ class AzureInventory(object): the Windows Azure API provides. """ if hostname not in self.host_metadata: - return "No host found: %s" % hostname + return "No host found: %s" % json.dumps(self.host_metadata) if jsonify: return json.dumps(self.host_metadata[hostname]) return self.host_metadata[hostname] @@ -220,12 +220,19 @@ class AzureInventory(object): def add_deployment(self, cloud_service, deployment): """Adds a deployment to the inventory and index""" for role in deployment.role_instance_list.role_instances: - for ie in role.instance_endpoints.instance_endpoints: - if ie.name == 'SSH': - self.add_instance(role.instance_name, deployment, ie.public_port, cloud_service) - break + try: + # Default port 22 unless port found with name 'SSH' + port = '22' + for ie in role.instance_endpoints.instance_endpoints: + if ie.name == 'SSH': + port = ie.public_port + break + except AttributeError as e: + pass + finally: + self.add_instance(role.instance_name, deployment, port, cloud_service, role.instance_status) - def add_instance(self, hostname, deployment, ssh_port, cloud_service): + def add_instance(self, hostname, deployment, ssh_port, cloud_service, status): """Adds an instance to the inventory and index""" dest = urlparse(deployment.url).hostname @@ -234,7 +241,9 @@ class AzureInventory(object): self.index[hostname] = deployment.name self.host_metadata[hostname] = dict(ansible_ssh_host=dest, - ansible_ssh_port=int(ssh_port)) + ansible_ssh_port=int(ssh_port), + instance_status=status, + private_id=deployment.private_id) # List of all azure deployments self.push(self.inventory, "azure", hostname) diff --git a/awx/settings/defaults.py b/awx/settings/defaults.py index 36656d1afb..1d85ecac19 100644 --- a/awx/settings/defaults.py +++ b/awx/settings/defaults.py @@ -513,15 +513,15 @@ AZURE_REGIONS_BLACKLIST = [] # Inventory variable name/value for determining whether a host is active # in Microsoft Azure. -AZURE_ENABLED_VAR = 'status' -AZURE_ENABLED_VALUE = 'created' +AZURE_ENABLED_VAR = 'instance_status' +AZURE_ENABLED_VALUE = 'ReadyRole' # Filter for allowed group and host names when importing inventory from # Microsoft Azure. AZURE_GROUP_FILTER = r'^.+$' AZURE_HOST_FILTER = r'^.+$' AZURE_EXCLUDE_EMPTY_GROUPS = True -AZURE_INSTANCE_ID_VAR = None +AZURE_INSTANCE_ID_VAR = 'private_id' # --------------------- # ----- OpenStack -----