1#!/usr/local/bin/python3.8 2 3# (c) 2013, Michael Scherer <misc@zarb.org> 4# 5# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) 6 7from __future__ import (absolute_import, division, print_function) 8__metaclass__ = type 9 10DOCUMENTATION = ''' 11--- 12inventory: openshift 13short_description: Openshift gears external inventory script 14description: 15 - Generates inventory of Openshift gears using the REST interface 16 - this permit to reuse playbook to setup an Openshift gear 17author: Michael Scherer 18''' 19 20import json 21import os 22import os.path 23import sys 24import StringIO 25 26from ansible.module_utils.urls import open_url 27from ansible.module_utils.six.moves import configparser as ConfigParser 28 29configparser = None 30 31 32def get_from_rhc_config(variable): 33 global configparser 34 CONF_FILE = os.path.expanduser('~/.openshift/express.conf') 35 if os.path.exists(CONF_FILE): 36 if not configparser: 37 ini_str = '[root]\n' + open(CONF_FILE, 'r').read() 38 configparser = ConfigParser.SafeConfigParser() 39 configparser.readfp(StringIO.StringIO(ini_str)) 40 try: 41 return configparser.get('root', variable) 42 except ConfigParser.NoOptionError: 43 return None 44 45 46def get_config(env_var, config_var): 47 result = os.getenv(env_var) 48 if not result: 49 result = get_from_rhc_config(config_var) 50 if not result: 51 sys.exit("failed=True msg='missing %s'" % env_var) 52 return result 53 54 55def get_json_from_api(url, username, password): 56 headers = {'Accept': 'application/json; version=1.5'} 57 response = open_url(url, headers=headers, url_username=username, url_password=password) 58 return json.loads(response.read())['data'] 59 60 61username = get_config('ANSIBLE_OPENSHIFT_USERNAME', 'default_rhlogin') 62password = get_config('ANSIBLE_OPENSHIFT_PASSWORD', 'password') 63broker_url = 'https://%s/broker/rest/' % get_config('ANSIBLE_OPENSHIFT_BROKER', 'libra_server') 64 65 66response = get_json_from_api(broker_url + '/domains', username, password) 67 68response = get_json_from_api("%s/domains/%s/applications" % 69 (broker_url, response[0]['id']), username, password) 70 71result = {} 72for app in response: 73 74 # ssh://520311404832ce3e570000ff@blog-johndoe.example.org 75 (user, host) = app['ssh_url'][6:].split('@') 76 app_name = host.split('-')[0] 77 78 result[app_name] = {} 79 result[app_name]['hosts'] = [] 80 result[app_name]['hosts'].append(host) 81 result[app_name]['vars'] = {} 82 result[app_name]['vars']['ansible_ssh_user'] = user 83 84if len(sys.argv) == 2 and sys.argv[1] == '--list': 85 print(json.dumps(result)) 86elif len(sys.argv) == 3 and sys.argv[1] == '--host': 87 print(json.dumps({})) 88else: 89 print("Need an argument, either --list or --host <host>") 90