diff --git a/plugins/inventory/float.py b/plugins/inventory/float.py
index 6038e2f28a0c6d1513dc215d03c85dc8b4e3575e..49f81dc55397b5d2311f2262b99a8ff9a48ede9b 100644
--- a/plugins/inventory/float.py
+++ b/plugins/inventory/float.py
@@ -205,26 +205,27 @@ def _host_dns_map(name, inventory):
 
 
 # Return all service-related DNS names for a specific host.
-def _host_service_names(name, service_name, inventory, is_leader):
+def _host_service_names(name, service_name, inventory, is_leader, host_service_idx):
     # Use a set for deduplication when hostname == shard_id.
     names = set([
         service_name,
-        name + '.' + service_name,
-        name + '.host.' + service_name,
+        f'{name}.{service_name}',
+        f'{name}.host.{service_name}',
+        f'{host_service_idx}.index.{service_name}',
     ])
     if 'shard_id' in inventory['hosts'][name]:
         shard_id = inventory['hosts'][name]['shard_id']
-        names.add(shard_id + '.' + service_name)
-        names.add(shard_id + '.shard.' + service_name)
+        names.add(f'{shard_id}.{service_name}')
+        names.add(f'{shard_id}.shard.{service_name}')
     if is_leader:
-        names.add(service_name + '-master')
+        names.add(f'{service_name}-master')
     return list(names)
 
 
 # Return host-specific parameters for the X509 service credentials
 # associated with a service.
-def _service_credential_params(name, service_name, inventory, is_leader):
-    names = _host_service_names(name, service_name, inventory, is_leader)
+def _service_credential_params(name, service_name, inventory, is_leader, host_service_idx):
+    names = _host_service_names(name, service_name, inventory, is_leader, host_service_idx)
     names.append('localhost')
     names.append(name)
     addrs = _host_addrs(name, inventory)
@@ -248,13 +249,15 @@ def _common_net_overlay(hosta, hostb, inventory):
 # Build the service discovery DNS map for a service as seen from src_host.
 def _service_dns(src_host, service_name, service, inventory, assignments):
     dns = {}
-    for hostname in assignments.get_by_service(service_name):
+    for host_service_idx, hostname in enumerate(
+            assignments.get_by_service(service_name)):
         # Find the overlay in common between source and target host,
         # and use the target IP on that network.
         overlay = _common_net_overlay(src_host, hostname, inventory)
         addrs = _host_net_overlay_addrs(hostname, inventory, overlay)
         is_leader = assignments.is_master(service_name, hostname)
-        for name in _host_service_names(hostname, service_name, inventory, is_leader):
+        for name in _host_service_names(
+                hostname, service_name, inventory, is_leader, host_service_idx):
             dns.setdefault(name, []).extend(addrs)
     return dns
 
@@ -420,7 +423,7 @@ def _host_vars(name, inventory, services, assignments):
             for c in services[s].get('service_credentials', []):
                 if c.get('enable_server', True):
                     params = _service_credential_params(
-                        name, s, inventory, assignments.is_master(s, name))
+                        name, s, inventory, assignments.is_master(s, name), idx)
                     hv['float_host_service_credentials'].append({
                         'credentials': c, 'service': s,
                         'mode': 'server', 'x509_params': params})