inventory.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #!/usr/bin/env python
  2. """
  3. This is an Ansible dynamic inventory for OpenStack.
  4. It requires your OpenStack credentials to be set in clouds.yaml or your shell
  5. environment.
  6. """
  7. from __future__ import print_function
  8. from collections import Mapping
  9. import json
  10. import shade
  11. def build_inventory():
  12. '''Build the dynamic inventory.'''
  13. cloud = shade.openstack_cloud()
  14. inventory = {}
  15. # TODO(shadower): filter the servers based on the `OPENSHIFT_CLUSTER`
  16. # environment variable.
  17. cluster_hosts = [
  18. server for server in cloud.list_servers()
  19. if 'metadata' in server and 'clusterid' in server.metadata]
  20. masters = [server.name for server in cluster_hosts
  21. if server.metadata['host-type'] == 'master']
  22. etcd = [server.name for server in cluster_hosts
  23. if server.metadata['host-type'] == 'etcd']
  24. if not etcd:
  25. etcd = masters
  26. infra_hosts = [server.name for server in cluster_hosts
  27. if server.metadata['host-type'] == 'node' and
  28. server.metadata['sub-host-type'] == 'infra']
  29. app = [server.name for server in cluster_hosts
  30. if server.metadata['host-type'] == 'node' and
  31. server.metadata['sub-host-type'] == 'app']
  32. cns = [server.name for server in cluster_hosts
  33. if server.metadata['host-type'] == 'cns']
  34. nodes = list(set(masters + infra_hosts + app + cns))
  35. dns = [server.name for server in cluster_hosts
  36. if server.metadata['host-type'] == 'dns']
  37. load_balancers = [server.name for server in cluster_hosts
  38. if server.metadata['host-type'] == 'lb']
  39. osev3 = list(set(nodes + etcd + load_balancers))
  40. inventory['cluster_hosts'] = {'hosts': [s.name for s in cluster_hosts]}
  41. inventory['OSEv3'] = {'hosts': osev3}
  42. inventory['masters'] = {'hosts': masters}
  43. inventory['etcd'] = {'hosts': etcd}
  44. inventory['nodes'] = {'hosts': nodes}
  45. inventory['infra_hosts'] = {'hosts': infra_hosts}
  46. inventory['app'] = {'hosts': app}
  47. inventory['glusterfs'] = {'hosts': cns}
  48. inventory['dns'] = {'hosts': dns}
  49. inventory['lb'] = {'hosts': load_balancers}
  50. for server in cluster_hosts:
  51. if 'group' in server.metadata:
  52. group = server.metadata.group
  53. if group not in inventory:
  54. inventory[group] = {'hosts': []}
  55. inventory[group]['hosts'].append(server.name)
  56. inventory['_meta'] = {'hostvars': {}}
  57. for server in cluster_hosts:
  58. ssh_ip_address = server.public_v4 or server.private_v4
  59. hostvars = {
  60. 'ansible_host': ssh_ip_address
  61. }
  62. public_v4 = server.public_v4 or server.private_v4
  63. if public_v4:
  64. hostvars['public_v4'] = server.public_v4
  65. hostvars['openshift_public_ip'] = server.public_v4
  66. # TODO(shadower): what about multiple networks?
  67. if server.private_v4:
  68. hostvars['private_v4'] = server.private_v4
  69. hostvars['openshift_ip'] = server.private_v4
  70. # NOTE(shadower): Yes, we set both hostname and IP to the private
  71. # IP address for each node. OpenStack doesn't resolve nodes by
  72. # name at all, so using a hostname here would require an internal
  73. # DNS which would complicate the setup and potentially introduce
  74. # performance issues.
  75. hostvars['openshift_hostname'] = server.metadata.get(
  76. 'openshift_hostname', server.private_v4)
  77. hostvars['openshift_public_hostname'] = server.name
  78. if server.metadata['host-type'] == 'cns':
  79. hostvars['glusterfs_devices'] = ['/dev/nvme0n1']
  80. node_labels = server.metadata.get('node_labels')
  81. # NOTE(shadower): the node_labels value must be a dict not string
  82. if not isinstance(node_labels, Mapping):
  83. node_labels = json.loads(node_labels)
  84. if node_labels:
  85. hostvars['openshift_node_labels'] = node_labels
  86. inventory['_meta']['hostvars'][server.name] = hostvars
  87. return inventory
  88. if __name__ == '__main__':
  89. print(json.dumps(build_inventory(), indent=4, sort_keys=True))