diff options
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/cluster | 7 | ||||
-rwxr-xr-x | bin/ohi | 4 | ||||
-rw-r--r-- | bin/openshift_ansible/awsutil.py | 37 | ||||
-rwxr-xr-x | bin/oscp | 79 | ||||
-rwxr-xr-x | bin/ossh | 92 | ||||
-rwxr-xr-x | bin/ossh_bash_completion | 6 | ||||
-rw-r--r-- | bin/ossh_zsh_completion | 6 |
7 files changed, 82 insertions, 149 deletions
diff --git a/bin/cluster b/bin/cluster index c3b101c98..ecb8bc58e 100755 --- a/bin/cluster +++ b/bin/cluster @@ -264,6 +264,13 @@ if __name__ == '__main__': providers = gce,aws,libvirt,openstack """ + warning = ("================================================================================\n" + "ATTENTION: You are running a community supported utility that has not been\n" + "tested by Red Hat. Visit https://docs.openshift.com for supported installation\n" + "instructions.\n" + "================================================================================\n\n") + sys.stderr.write(warning) + cluster_config = ConfigParser.SafeConfigParser({ 'cluster_ids': 'marketing,sales', 'validate_cluster_ids': 'False', @@ -34,6 +34,7 @@ class Ohi(object): 'openshift_ansible', \ 'openshift_ansible.conf') + self.args = None self.parse_cli_args() self.parse_config_file() @@ -57,6 +58,7 @@ class Ohi(object): hosts = self.aws.get_host_list(clusters=self.args.cluster, host_type=self.args.host_type, + sub_host_type=self.args.sub_host_type, envs=self.args.env, version=version, cached=self.args.cache_only) @@ -104,6 +106,8 @@ class Ohi(object): parser.add_argument('-t', '--host-type', action="store", help="Which host type to use") + parser.add_argument('-s', '--sub-host-type', action="store", help="Which sub host type to use") + parser.add_argument('-l', '--user', action='store', default=None, help='username') parser.add_argument('--cache-only', action='store_true', default=False, diff --git a/bin/openshift_ansible/awsutil.py b/bin/openshift_ansible/awsutil.py index 945e6a20c..11651f087 100644 --- a/bin/openshift_ansible/awsutil.py +++ b/bin/openshift_ansible/awsutil.py @@ -31,6 +31,7 @@ class AwsUtil(object): host_type_aliases -- a list of aliases to common host-types (e.g. ex-node) """ + self.alias_lookup = {} host_type_aliases = host_type_aliases or {} self.host_type_aliases = host_type_aliases @@ -40,7 +41,6 @@ class AwsUtil(object): def setup_host_type_alias_lookup(self): """Sets up the alias to host-type lookup table.""" - self.alias_lookup = {} for key, values in self.host_type_aliases.iteritems(): for value in values: self.alias_lookup[value] = key @@ -101,6 +101,20 @@ class AwsUtil(object): host_types.sort() return host_types + def get_sub_host_types(self): + """Searches for sub-host-type tags in the inventory and returns all sub-host-types found.""" + pattern = re.compile(r'^oo_subhosttype_(.*)') + + sub_host_types = [] + inv = self.get_inventory() + for key in inv.keys(): + matched = pattern.match(key) + if matched: + sub_host_types.append(matched.group(1)) + + sub_host_types.sort() + return sub_host_types + def get_security_groups(self): """Searches for security_groups in the inventory and returns all SGs found.""" pattern = re.compile(r'^security_group_(.*)') @@ -123,13 +137,13 @@ class AwsUtil(object): inst_by_env = {} for _, host in inv['_meta']['hostvars'].items(): # If you don't have an environment tag, we're going to ignore you - if 'ec2_tag_environment' not in host: + if 'oo_environment' not in host: continue - if host['ec2_tag_environment'] not in inst_by_env: - inst_by_env[host['ec2_tag_environment']] = {} - host_id = "%s:%s" % (host['ec2_tag_Name'], host['ec2_id']) - inst_by_env[host['ec2_tag_environment']][host_id] = host + if host['oo_environment'] not in inst_by_env: + inst_by_env[host['oo_environment']] = {} + host_id = "%s:%s" % (host['oo_name'], host['oo_id']) + inst_by_env[host['oo_environment']][host_id] = host return inst_by_env @@ -192,9 +206,15 @@ class AwsUtil(object): host_type = self.resolve_host_type(host_type) return "oo_hosttype_%s" % host_type + @staticmethod + def gen_sub_host_type_tag(sub_host_type): + """Generate the host type tag + """ + return "oo_subhosttype_%s" % sub_host_type + # This function uses all of these params to perform a filters on our host inventory. # pylint: disable=too-many-arguments - def get_host_list(self, clusters=None, host_type=None, envs=None, version=None, cached=False): + def get_host_list(self, clusters=None, host_type=None, sub_host_type=None, envs=None, version=None, cached=False): """Get the list of hosts from the inventory using host-type and environment """ retval = set([]) @@ -229,6 +249,9 @@ class AwsUtil(object): if host_type: retval.intersection_update(inv.get(self.gen_host_type_tag(host_type, version), [])) + if sub_host_type: + retval.intersection_update(inv.get(self.gen_sub_host_type_tag(sub_host_type), [])) + if version != 'all': retval.intersection_update(inv.get(AwsUtil.gen_version_tag(version), [])) @@ -14,6 +14,8 @@ CONFIG_MAIN_SECTION = 'main' class Oscp(object): def __init__(self): + self.host = None + self.user = '' self.file_path = os.path.join(os.path.dirname(os.path.realpath(__file__))) # Default the config path to /etc @@ -56,8 +58,6 @@ class Oscp(object): def parse_cli_args(self): parser = argparse.ArgumentParser(description='OpenShift Online SSH Tool.') - parser.add_argument('-e', '--env', - action="store", help="Environment where this server exists.") parser.add_argument('-d', '--debug', default=False, action="store_true", help="debug mode") parser.add_argument('-v', '--verbose', default=False, @@ -82,8 +82,6 @@ class Oscp(object): def process_host(self): '''Determine host name and user name for SSH. ''' - self.user = '' - # is the first param passed a valid file? if os.path.isfile(self.args.src) or os.path.isdir(self.args.src): self.local_src = True @@ -108,76 +106,34 @@ class Oscp(object): self.host = search.groups()[0] self.path = search.groups()[1] - if self.args.env: - self.env = self.args.env - elif "." in self.host: - self.host, self.env = self.host.split(".") - else: - self.env = None - def get_hosts(self, refresh_cache=False): - '''Query our host inventory and return a dict where the format - equals: - - dict['environment'] = [{'servername' : {}}, ] - ''' + '''Query our host inventory and return a dict where the format ''' if refresh_cache: - self.host_inventory = self.aws.build_host_dict_by_env(['--refresh-cache']) + self.host_inventory = self.aws.get_inventory(['--refresh-cache'])['_meta']['hostvars'] else: - self.host_inventory = self.aws.build_host_dict_by_env() + self.host_inventory = self.aws.get_inventory()['_meta']['hostvars'] def select_host(self): '''select host attempts to match the host specified on the command line with a list of hosts. ''' - results = [] - for env in self.host_inventory.keys(): - for hostname, server_info in self.host_inventory[env].items(): - if hostname.split(':')[0] == self.host: - results.append((hostname, server_info)) - - # attempt to select the correct environment if specified - if self.env: - results = filter(lambda result: result[1]['oo_environment'] == self.env, results) - - if results: - return results + results = None + if self.host_inventory.has_key(self.host): + results = (self.host, self.host_inventory[self.host]) else: print "Could not find specified host: %s." % self.host # default - no results found. - return None + return results def list_hosts(self, limit=None): '''Function to print out the host inventory. Takes a single parameter to limit the number of hosts printed. ''' - - if self.env: - results = self.select_host() - if len(results) == 1: - hostname, server_info = results[0] - sorted_keys = server_info.keys() - sorted_keys.sort() - for key in sorted_keys: - print '{0:<35} {1}'.format(key, server_info[key]) - else: - for host_id, server_info in results[:limit]: - print '{oo_name:<35} {oo_clusterid:<10} {oo_environment:<8} ' \ - '{oo_id:<15} {oo_public_ip:<18} {oo_private_ip:<18}'.format(**server_info) - - if limit: - print - print 'Showing only the first %d results...' % limit - print - - else: - for env, host_ids in self.host_inventory.items(): - for host_id, server_info in host_ids.items(): - print '{oo_name:<35} {oo_clusterid:<10} {oo_environment:<8} ' \ - '{oo_id:<15} {oo_public_ip:<18} {oo_private_ip:<18}'.format(**server_info) - + for host_id, server_info in self.host_inventory.items(): + print '{oo_name:<35} {oo_clusterid:<10} {oo_environment:<8} ' \ + '{oo_id:<15} {oo_public_ip:<18} {oo_private_ip:<18}'.format(**server_info) def scp(self): '''scp files to or from a specified host @@ -203,17 +159,10 @@ class Oscp(object): if not results: return # early exit, no results - if len(results) > 1: - print "Multiple results found for %s." % self.host - for result in results: - print "{oo_name:<35} {oo_clusterid:<5} {oo_environment:<5} {oo_id:<10}".format(**result[1]) - return # early exit, too many results - # Assume we have one and only one. - hostname, server_info = results[0] - dns = server_info['oo_public_ip'] + server_info = results[1] - host_str = "%s%s%s" % (self.user, dns, self.path) + host_str = "%s%s%s" % (self.user, server_info['oo_public_ip'], self.path) if self.local_src: scp_args.append(self.args.src) @@ -14,6 +14,8 @@ CONFIG_MAIN_SECTION = 'main' class Ossh(object): def __init__(self): + self.user = None + self.host = None self.file_path = os.path.join(os.path.dirname(os.path.realpath(__file__))) # Default the config path to /etc @@ -54,8 +56,6 @@ class Ossh(object): def parse_cli_args(self): parser = argparse.ArgumentParser(description='OpenShift Online SSH Tool.') - parser.add_argument('-e', '--env', action="store", - help="Which environment to search for the host ") parser.add_argument('-d', '--debug', default=False, action="store_true", help="debug mode") parser.add_argument('-v', '--verbose', default=False, @@ -83,91 +83,48 @@ class Ossh(object): def process_host(self): '''Determine host name and user name for SSH. ''' - self.env = None - self.user = None - - re_env = re.compile("\.(" + "|".join(self.host_inventory.keys()) + ")") - search = re_env.search(self.args.host) - if self.args.env: - self.env = self.args.env - elif search: - # take the first? - self.env = search.groups()[0] - # remove env from hostname command line arg if found - if search: - self.args.host = re_env.split(self.args.host)[0] + parts = self.args.host.split('@') # parse username if passed - if '@' in self.args.host: - self.user, self.host = self.args.host.split('@') + if len(parts) > 1: + self.user = parts[0] + self.host = parts[1] else: - self.host = self.args.host + self.host = parts[0] + if self.args.login_name: self.user = self.args.login_name - def get_hosts(self, refresh_cache=False): - '''Query our host inventory and return a dict where the format - equals: - dict['servername'] = dns_name - ''' + def get_hosts(self, refresh_cache=False): + '''Query our host inventory and return a dict where the format ''' if refresh_cache: - self.host_inventory = self.aws.build_host_dict_by_env(['--refresh-cache']) + self.host_inventory = self.aws.get_inventory(['--refresh-cache'])['_meta']['hostvars'] else: - self.host_inventory = self.aws.build_host_dict_by_env() + self.host_inventory = self.aws.get_inventory()['_meta']['hostvars'] def select_host(self): '''select host attempts to match the host specified on the command line with a list of hosts. ''' - results = [] - for env in self.host_inventory.keys(): - for hostname, server_info in self.host_inventory[env].items(): - if hostname.split(':')[0] == self.host: - results.append((hostname, server_info)) - - # attempt to select the correct environment if specified - if self.env: - results = filter(lambda result: result[1]['oo_environment'] == self.env, results) - - if results: - return results + results = None + if self.host_inventory.has_key(self.host): + results = (self.host, self.host_inventory[self.host]) else: print "Could not find specified host: %s." % self.host # default - no results found. - return None + return results def list_hosts(self, limit=None): '''Function to print out the host inventory. Takes a single parameter to limit the number of hosts printed. ''' - - if self.env: - results = self.select_host() - if len(results) == 1: - hostname, server_info = results[0] - sorted_keys = server_info.keys() - sorted_keys.sort() - for key in sorted_keys: - print '{0:<35} {1}'.format(key, server_info[key]) - else: - for host_id, server_info in results[:limit]: - print '{oo_name:<35} {oo_clusterid:<10} {oo_environment:<8} ' \ - '{oo_id:<15} {oo_public_ip:<18} {oo_private_ip:<18}'.format(**server_info) - - if limit: - print - print 'Showing only the first %d results...' % limit - print - - else: - for env, host_ids in self.host_inventory.items(): - for host_id, server_info in host_ids.items(): - print '{oo_name:<35} {oo_clusterid:<10} {oo_environment:<8} ' \ - '{oo_id:<15} {oo_public_ip:<18} {oo_private_ip:<18}'.format(**server_info) + for host_id, server_info in self.host_inventory.items(): + print '{oo_name:<35} {oo_clusterid:<10} {oo_environment:<8} ' \ + '{oo_id:<15} {oo_public_ip:<18} {oo_private_ip:<18}'.format(**server_info) def ssh(self): '''SSH to a specified host @@ -193,17 +150,10 @@ class Ossh(object): if not results: return # early exit, no results - if len(results) > 1: - print "Multiple results found for %s." % self.host - for result in results: - print "{oo_name:<35} {oo_clusterid:<5} {oo_environment:<5} {oo_id:<10}".format(**result[1]) - return # early exit, too many results - # Assume we have one and only one. - _, server_info = results[0] - dns = server_info['oo_public_ip'] + server_info = results[1] - ssh_args.append(dns) + ssh_args.append(server_info['oo_public_ip']) #last argument if self.args.command: diff --git a/bin/ossh_bash_completion b/bin/ossh_bash_completion index 77b770a43..dcbde3e51 100755 --- a/bin/ossh_bash_completion +++ b/bin/ossh_bash_completion @@ -1,12 +1,12 @@ __ossh_known_hosts(){ if python -c 'import openshift_ansible' &>/dev/null; then - /usr/bin/python -c 'from openshift_ansible import multi_inventory; m=multi_inventory.MultiInventory(); m.run(); z=m.result; print "\n".join(["%s.%s" % (host["oo_name"],host["oo_environment"]) for dns, host in z["_meta"]["hostvars"].items() if all(k in host for k in ("oo_name", "oo_environment"))])' + /usr/bin/python -c 'from openshift_ansible import multi_inventory; m=multi_inventory.MultiInventory(); m.run(); z=m.result; print "\n".join([name for name in z["_meta"]["hostvars"].keys()])' elif [[ -f /dev/shm/.ansible/tmp/multi_inventory.cache ]]; then - /usr/bin/python -c 'import json; loc="/dev/shm/.ansible/tmp/multi_inventory.cache"; z=json.loads(open(loc).read()); print "\n".join(["%s.%s" % (host["oo_name"],host["oo_environment"]) for dns, host in z["_meta"]["hostvars"].items() if all(k in host for k in ("oo_name", "oo_environment"))])' + /usr/bin/python -c 'import json; loc="/dev/shm/.ansible/tmp/multi_inventory.cache"; z=json.loads(open(loc).read()); print "\n".join([name for name in z["_meta"]["hostvars"].keys()])' elif [[ -f ~/.ansible/tmp/multi_inventory.cache ]]; then - /usr/bin/python -c 'import json,os; loc="%s" % os.path.expanduser("~/.ansible/tmp/multi_inventory.cache"); z=json.loads(open(loc).read()); print "\n".join(["%s.%s" % (host["oo_name"],host["oo_environment"]) for dns, host in z["_meta"]["hostvars"].items() if all(k in host for k in ("oo_name", "oo_environment"))])' + /usr/bin/python -c 'import json,os; loc="%s" % os.path.expanduser("~/.ansible/tmp/multi_inventory.cache"); z=json.loads(open(loc).read()); print "\n".join([name for name in z["_meta"]["hostvars"].keys()])' fi } diff --git a/bin/ossh_zsh_completion b/bin/ossh_zsh_completion index 170ca889b..94ea61dab 100644 --- a/bin/ossh_zsh_completion +++ b/bin/ossh_zsh_completion @@ -2,13 +2,13 @@ _ossh_known_hosts(){ if python -c 'import openshift_ansible' &>/dev/null; then - print $(/usr/bin/python -c 'from openshift_ansible import multi_inventory; m=multi_inventory.MultiInventory(); m.run(); z=m.result; print "\n".join(["%s.%s" % (host["oo_name"],host["oo_environment"]) for dns, host in z["_meta"]["hostvars"].items() if all(k in host for k in ("oo_name", "oo_environment"))])') + print $(/usr/bin/python -c 'from openshift_ansible import multi_inventory; m=multi_inventory.MultiInventory(); m.run(); z=m.result; print "\n".join([name for name in z["_meta"]["hostvars"].keys()])') elif [[ -f /dev/shm/.ansible/tmp/multi_inventory.cache ]]; then - print $(/usr/bin/python -c 'import json; loc="/dev/shm/.ansible/tmp/multi_inventory.cache"; z=json.loads(open(loc).read()); print "\n".join(["%s.%s" % (host["oo_name"],host["oo_environment"]) for dns, host in z["_meta"]["hostvars"].items() if all(k in host for k in ("oo_name", "oo_environment"))])') + print $(/usr/bin/python -c 'import json; loc="/dev/shm/.ansible/tmp/multi_inventory.cache"; z=json.loads(open(loc).read()); print "\n".join([name for name in z["_meta"]["hostvars"].keys() ])') elif [[ -f ~/.ansible/tmp/multi_inventory.cache ]]; then - print $(/usr/bin/python -c 'import json,os; loc="%s" % os.path.expanduser("~/.ansible/tmp/multi_inventory.cache"); z=json.loads(open(loc).read()); print "\n".join(["%s.%s" % (host["oo_name"],host["oo_environment"]) for dns, host in z["_meta"]["hostvars"].items() if all(k in host for k in ("oo_name", "oo_environment"))])') + print $(/usr/bin/python -c 'import json,os; loc="%s" % os.path.expanduser("~/.ansible/tmp/multi_inventory.cache"); z=json.loads(open(loc).read()); print "\n".join([name for name in z["_meta"]["hostvars"].keys() ])') fi |