From 0457b96cd5b5252010208ee8f74d0a3da49573b2 Mon Sep 17 00:00:00 2001 From: Thomas Wiest Date: Thu, 8 Jan 2015 12:39:33 -0500 Subject: added opssh.py --- bin/ansibleutil.py | 49 ++++++++++++++++++++++++++++++++++++++++ bin/opssh.py | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 bin/ansibleutil.py create mode 100755 bin/opssh.py (limited to 'bin') diff --git a/bin/ansibleutil.py b/bin/ansibleutil.py new file mode 100644 index 000000000..7ba2c461e --- /dev/null +++ b/bin/ansibleutil.py @@ -0,0 +1,49 @@ +# vim: expandtab:tabstop=4:shiftwidth=4 + +import subprocess +import sys +import os +import json +import re + +class AnsibleUtil(object): + def __init__(self): + self.file_path = os.path.join(os.path.dirname(os.path.realpath(__file__))) + self.multi_ec2_path = os.path.realpath(os.path.join(self.file_path, '..','inventory','multi_ec2.py')) + + def get_inventory(self): + cmd = [self.multi_ec2_path] + env = {} + p = subprocess.Popen(cmd, stderr=subprocess.PIPE, + stdout=subprocess.PIPE, env=env) + + out,err = p.communicate() + + if p.returncode != 0: + raise RuntimeError(err) + + return json.loads(out) + + def get_environments(self): + pattern = re.compile(r'^tag_environment_(.*)') + + envs = [] + inv = self.get_inventory() + for key in inv.keys(): + m = pattern.match(key) + if m: + envs.append(m.group(1)) + + return envs + + def get_security_groups(self): + pattern = re.compile(r'^security_group_(.*)') + + groups = [] + inv = self.get_inventory() + for key in inv.keys(): + m = pattern.match(key) + if m: + groups.append(m.group(1)) + + return groups diff --git a/bin/opssh.py b/bin/opssh.py new file mode 100755 index 000000000..6ee390c4c --- /dev/null +++ b/bin/opssh.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# vim: expandtab:tabstop=4:shiftwidth=4 + +import argparse +import os +import ansibleutil +import sys + +class Program(object): + def __init__(self): + self.file_path = os.path.join(os.path.dirname(os.path.realpath(__file__))) + self.parse_cli_args() + self.ansible = ansibleutil.AnsibleUtil() + + inv = self.ansible.get_inventory() + #print inv.keys() + #sys.exit() + + if self.args.list_environments: + self.list_environments() + sys.exit() + + if self.args.list_groups: + self.list_security_groups() + sys.exit() + + def parse_cli_args(self): + parser = argparse.ArgumentParser( + description='OpenShift Online Operations Parallel SSH' + ) + + parser.add_argument("-v", '--verbosity', action="count", + help="increase output verbosity") + + group = parser.add_mutually_exclusive_group() + + group.add_argument('--list-environments', action="store_true", + help='List all environments') + group.add_argument('--list-groups', action="store_true", + help='List all security groups') + group.add_argument('-e', '--environment', + help='Set the environment') + + self.args = parser.parse_args() + + def list_environments(self): + envs = self.ansible.get_environments() + print + print "Environments" + print "------------" + for env in envs: + print env + print + + def list_security_groups(self): + envs = self.ansible.get_security_groups() + print + print "Groups" + print "------" + for env in envs: + print env + print + + +if __name__ == '__main__': + p = Program() -- cgit v1.2.3 From d3dee2db1c87b074075b3bbcbe8931862ee7eca3 Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Fri, 30 Jan 2015 16:29:56 -0500 Subject: Adding ossh.py --- bin/ansibleutil.py | 20 +++++++++++++++++++- bin/ossh.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100755 bin/ossh.py (limited to 'bin') diff --git a/bin/ansibleutil.py b/bin/ansibleutil.py index 7ba2c461e..a16a4dca9 100644 --- a/bin/ansibleutil.py +++ b/bin/ansibleutil.py @@ -22,7 +22,9 @@ class AnsibleUtil(object): if p.returncode != 0: raise RuntimeError(err) - return json.loads(out) + with open('/tmp/ans.out','w') as fd: + fd.writelines(out) + return json.loads(out.strip()) def get_environments(self): pattern = re.compile(r'^tag_environment_(.*)') @@ -47,3 +49,19 @@ class AnsibleUtil(object): groups.append(m.group(1)) return groups + + def get_host_address(self): + pattern = re.compile(r'^tag_Name_(.*)') + inv = self.get_inventory() + + inst_names = {} + for key in inv.keys(): + m = pattern.match(key) + if m: inst_names[m.group(1)] = inv[key] + + + return inst_names + + + + diff --git a/bin/ossh.py b/bin/ossh.py new file mode 100755 index 000000000..2a24e807d --- /dev/null +++ b/bin/ossh.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +import argparse +import ansibleutil +import sys +import os + + +# use dynamic inventory +# list instances +# symlinked to ~/bin +# list instances that match pattern +# python! + + +class Ossh(object): + def __init__(self): + self.file_path = os.path.join(os.path.dirname(os.path.realpath(__file__))) + self.parse_cli_args() + self.ansible = ansibleutil.AnsibleUtil() + + self.list_hosts() + + def parse_cli_args(self): + parser = argparse.ArgumentParser(description='Openshift Online SSH Tool.') + parser.add_argument('-l', '--list', default=True, + action="store_true", help="list out hosts") + + self.args = parser.parse_args() + + def list_hosts(self): + # TODO: perform a numerical sort on these hosts + # and display them + print self.ansible.get_host_address() + + def ssh(self): + pass + +def main(): + ossh = Ossh() + + +if __name__ == '__main__': + main() + -- cgit v1.2.3 From 6481ca629cc2bcf5bd9c7f15be14a77e57086514 Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Tue, 3 Feb 2015 15:08:26 -0500 Subject: ossh script added for ssh meta query capabilities --- bin/ansibleutil.py | 22 +++--- bin/ossh.py | 195 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 202 insertions(+), 15 deletions(-) (limited to 'bin') diff --git a/bin/ansibleutil.py b/bin/ansibleutil.py index a16a4dca9..26fb25493 100644 --- a/bin/ansibleutil.py +++ b/bin/ansibleutil.py @@ -22,8 +22,8 @@ class AnsibleUtil(object): if p.returncode != 0: raise RuntimeError(err) - with open('/tmp/ans.out','w') as fd: - fd.writelines(out) + #with open('/tmp/ans.out','w') as fd: + #fd.writelines(out) return json.loads(out.strip()) def get_environments(self): @@ -50,18 +50,22 @@ class AnsibleUtil(object): return groups - def get_host_address(self): - pattern = re.compile(r'^tag_Name_(.*)') + def build_host_dict(self): inv = self.get_inventory() - inst_names = {} - for key in inv.keys(): - m = pattern.match(key) - if m: inst_names[m.group(1)] = inv[key] + inst_by_env = {} + for dns, host in inv['_meta']['hostvars'].items(): + if host['ec2_tag_environment'] not in inst_by_env: + inst_by_env[host['ec2_tag_environment']] = {} + + #if inst_by_env[host['ec2_tag_environment']][host['ec2_tag_Name']]: + #raise Exception('Duplicate ec2_tag_Name found: %s' % host['ec2_tag_Name']) + host_id = "%s:%s" % (host['ec2_tag_Name'],host['ec2_id']) + inst_by_env[host['ec2_tag_environment']][host_id] = host - return inst_names + return inst_by_env diff --git a/bin/ossh.py b/bin/ossh.py index 2a24e807d..d0f4a1475 100755 --- a/bin/ossh.py +++ b/bin/ossh.py @@ -1,9 +1,12 @@ #!/usr/bin/env python +import pdb import argparse import ansibleutil +import traceback import sys import os +import re # use dynamic inventory @@ -12,6 +15,11 @@ import os # list instances that match pattern # python! +# list environment stuff as well +# 3 states: +# - an exact match; return result +# - a partial match; return all regex results +# - no match; None class Ossh(object): def __init__(self): @@ -19,22 +27,197 @@ class Ossh(object): self.parse_cli_args() self.ansible = ansibleutil.AnsibleUtil() - self.list_hosts() - + self.host_inventory = self.get_hosts() + + + if self.args.debug: + print self.args + + # get a dict of host inventory + self.get_hosts() + + # parse host and user + self.process_host() + + # perform the SSH + if self.args.list: + self.list_hosts() + else: + self.ssh() + def parse_cli_args(self): parser = argparse.ArgumentParser(description='Openshift Online SSH Tool.') - parser.add_argument('-l', '--list', default=True, + parser.add_argument('-r', '--random', action="store", + help="Choose a random host") + 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, + action="store_true", help="Verbose?") + parser.add_argument('--list', default=False, action="store_true", help="list out hosts") + parser.add_argument('host') + parser.add_argument('-c', '--command', action='store', + help='Command to run on remote host') + parser.add_argument('-l', '--login_name', action='store', + help='User in which to ssh as') + + parser.add_argument('-o', '--ssh_opts', action='store', + help='options to pass to SSH.\n \ + "-o ForwardX11 yes"') self.args = parser.parse_args() - def list_hosts(self): + def process_host(self): + '''Determine host name and user name for SSH. + ''' + self.env = None + + re_env = re.compile('\.(int|stg|prod|ops)') + 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] + + # parse username if passed + if '@' in self.args.host: + self.user, self.host = self.args.host.split('@') + else: + self.host = self.args.host + if self.args.login_name: + self.user = self.args.login_name + else: + self.user = os.environ['USER'] + + + + def get_hosts(self): + '''Query our host inventory and return a dict where the format + equals: + + dict['servername'] = dns_name + ''' # TODO: perform a numerical sort on these hosts # and display them - print self.ansible.get_host_address() + self.host_inventory = self.ansible.build_host_dict() + + def select_host(self, regex=False): + '''select host attempts to match the host specified + on the command line with a list of hosts. + + if regex is specified then we will attempt to match + all *{host_string}* equivalents. + ''' +# list environment stuff as well +# 3 states: +# - an exact match; return result +# - a partial match; return all regex results +# - no match; None + re_host = re.compile(self.host) + + exact = [] + results = [] + for hostname, server_info in self.host_inventory[self.env].items(): + if hostname.split(':')[0] == self.host: + exact.append((hostname, server_info)) + break + elif re_host.search(hostname): + results.append((hostname, server_info)) + + if exact: + return exact + elif results: + return results + else: + print "Could not find specified host: %s in %s" % (self.host, self.env) + + # default - no results found. + return None + + + 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(True) + 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]: + name = server_info['ec2_tag_Name'] + ec2_id = server_info['ec2_id'] + ip = server_info['ec2_ip_address'] + print '{ec2_tag_Name:<35} {ec2_tag_environment:<8} {ec2_id:<15} {ec2_ip_address}'.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(): + name = server_info['ec2_tag_Name'] + ec2_id = server_info['ec2_id'] + ip = server_info['ec2_ip_address'] + print '{ec2_tag_Name:<35} {ec2_tag_environment:<5} {ec2_id:<15} {ec2_ip_address}'.format(**server_info) def ssh(self): - pass + '''SSH to a specified host + ''' + try: + cmd = '/usr/bin/ssh' + ssh_args = [cmd, '-l%s' % self.user] + #ssh_args = [cmd, ] + + if self.args.verbose: + ssh_args.append('-vvv') + + if self.args.ssh_opts: + ssh_args.append("-o%s" % self.args.ssh_opts) + + result = self.select_host() + if not result: + return # early exit, no results + + if len(result) > 1: + self.list_hosts(10) + return # early exit, too many results + + # Assume we have one and only one. + hostname, server_info = result[0] + ip = server_info['ec2_ip_address'] + + ssh_args.append(ip) + + #last argument + if self.args.command: + ssh_args.append("%s" % self.args.command) + + if self.args.debug: + print "SSH to %s in %s as %s" % (hostname, self.env, self.user) + + print "Running: %s\n" % ' '.join(ssh_args) + + os.execve('/usr/bin/ssh', ssh_args, os.environ) + except: + print traceback.print_exc() + print sys.exc_info() + def main(): ossh = Ossh() -- cgit v1.2.3 From fe7d30b762357ac4ec1fe2b173320d463267ac82 Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Wed, 4 Feb 2015 12:06:41 -0500 Subject: Renamed ossh.py and added bash completion function --- bin/COMPLETION_SETUP | 21 +++++ bin/ansibleutil.py | 4 - bin/ossh | 235 +++++++++++++++++++++++++++++++++++++++++++++++ bin/ossh.py | 228 --------------------------------------------- bin/ossh_bash_completion | 18 ++++ 5 files changed, 274 insertions(+), 232 deletions(-) create mode 100644 bin/COMPLETION_SETUP create mode 100755 bin/ossh delete mode 100755 bin/ossh.py create mode 100755 bin/ossh_bash_completion (limited to 'bin') diff --git a/bin/COMPLETION_SETUP b/bin/COMPLETION_SETUP new file mode 100644 index 000000000..c11a2dfff --- /dev/null +++ b/bin/COMPLETION_SETUP @@ -0,0 +1,21 @@ +# ossh is an ssh replacement. + +Ossh uses a dynamic inventory cache in order to lookup hostnames and translate them +to something meaningful such as an IP address or dns name. + +This allows us to treat our servers as cattle and not as pets. + +In order to setup bash completion, source the following script: +/path/to/repository/openshift-online-ansible/bin/ossh_bash_completion + +This bash_completion script will look at the cached version of your +multi_ec2 results in ~/.ansible/tmp/. It will then parse a few +host.env out of the json and return them to be completable. + +If you have not run the ossh command and it has not laid down +a cache file the completions will not be available. + +You can populate the cache by running `ossh --list`. This +will populate the cache file and the completions should +become available. + diff --git a/bin/ansibleutil.py b/bin/ansibleutil.py index 26fb25493..ed35ef8f9 100644 --- a/bin/ansibleutil.py +++ b/bin/ansibleutil.py @@ -57,10 +57,6 @@ class AnsibleUtil(object): for dns, host in inv['_meta']['hostvars'].items(): if host['ec2_tag_environment'] not in inst_by_env: inst_by_env[host['ec2_tag_environment']] = {} - - #if inst_by_env[host['ec2_tag_environment']][host['ec2_tag_Name']]: - #raise Exception('Duplicate ec2_tag_Name found: %s' % host['ec2_tag_Name']) - host_id = "%s:%s" % (host['ec2_tag_Name'],host['ec2_id']) inst_by_env[host['ec2_tag_environment']][host_id] = host diff --git a/bin/ossh b/bin/ossh new file mode 100755 index 000000000..2fa4bde37 --- /dev/null +++ b/bin/ossh @@ -0,0 +1,235 @@ +#!/usr/bin/env python + +import pdb +import argparse +import ansibleutil +import traceback +import sys +import os +import re + + +# use dynamic inventory +# list instances +# symlinked to ~/bin +# list instances that match pattern +# python! + +# list environment stuff as well +# 3 states: +# - an exact match; return result +# - a partial match; return all regex results +# - no match; None + +class Ossh(object): + def __init__(self): + self.file_path = os.path.join(os.path.dirname(os.path.realpath(__file__))) + self.parse_cli_args() + + if self.args.host == '' and not self.args.list: + self.parser.print_help() + return + + self.ansible = ansibleutil.AnsibleUtil() + + self.host_inventory = self.get_hosts() + + + if self.args.debug: + print self.args + + # get a dict of host inventory + self.get_hosts() + + # parse host and user + self.process_host() + + # perform the SSH + if self.args.list: + self.list_hosts() + else: + self.ssh() + + def parse_cli_args(self): + parser = argparse.ArgumentParser(description='Openshift Online SSH Tool.') + parser.add_argument('-r', '--random', action="store", + help="Choose a random host") + 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, + action="store_true", help="Verbose?") + parser.add_argument('--list', default=False, + action="store_true", help="list out hosts") + parser.add_argument('-c', '--command', action='store', + help='Command to run on remote host') + parser.add_argument('-l', '--login_name', action='store', + help='User in which to ssh as') + + parser.add_argument('-o', '--ssh_opts', action='store', + help='options to pass to SSH.\n \ + "-o ForwardX11 yes"') + parser.add_argument('host', nargs='?', default='') + + self.args = parser.parse_args() + self.parser = parser + + + def process_host(self): + '''Determine host name and user name for SSH. + ''' + self.env = None + + re_env = re.compile('\.(int|stg|prod|ops)') + 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] + + # parse username if passed + if '@' in self.args.host: + self.user, self.host = self.args.host.split('@') + else: + self.host = self.args.host + if self.args.login_name: + self.user = self.args.login_name + else: + self.user = os.environ['USER'] + + + + def get_hosts(self): + '''Query our host inventory and return a dict where the format + equals: + + dict['servername'] = dns_name + ''' + # TODO: perform a numerical sort on these hosts + # and display them + self.host_inventory = self.ansible.build_host_dict() + + def select_host(self, regex=False): + '''select host attempts to match the host specified + on the command line with a list of hosts. + + if regex is specified then we will attempt to match + all *{host_string}* equivalents. + ''' +# list environment stuff as well +# 3 states: +# - an exact match; return result +# - a partial match; return all regex results +# - no match; None + re_host = re.compile(self.host) + + exact = [] + results = [] + for hostname, server_info in self.host_inventory[self.env].items(): + if hostname.split(':')[0] == self.host: + exact.append((hostname, server_info)) + break + elif re_host.search(hostname): + results.append((hostname, server_info)) + + if exact: + return exact + elif results: + return results + else: + print "Could not find specified host: %s in %s" % (self.host, self.env) + + # default - no results found. + return None + + + 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(True) + 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]: + name = server_info['ec2_tag_Name'] + ec2_id = server_info['ec2_id'] + ip = server_info['ec2_ip_address'] + print '{ec2_tag_Name:<35} {ec2_tag_environment:<8} {ec2_id:<15} {ec2_ip_address}'.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(): + name = server_info['ec2_tag_Name'] + ec2_id = server_info['ec2_id'] + ip = server_info['ec2_ip_address'] + print '{ec2_tag_Name:<35} {ec2_tag_environment:<5} {ec2_id:<15} {ec2_ip_address}'.format(**server_info) + + def ssh(self): + '''SSH to a specified host + ''' + try: + cmd = '/usr/bin/ssh' + ssh_args = [cmd, '-l%s' % self.user] + #ssh_args = [cmd, ] + + if self.args.verbose: + ssh_args.append('-vvv') + + if self.args.ssh_opts: + ssh_args.append("-o%s" % self.args.ssh_opts) + + result = self.select_host() + if not result: + return # early exit, no results + + if len(result) > 1: + self.list_hosts(10) + return # early exit, too many results + + # Assume we have one and only one. + hostname, server_info = result[0] + ip = server_info['ec2_ip_address'] + + ssh_args.append(ip) + + #last argument + if self.args.command: + ssh_args.append("%s" % self.args.command) + + if self.args.debug: + print "SSH to %s in %s as %s" % (hostname, self.env, self.user) + + print "Running: %s\n" % ' '.join(ssh_args) + + os.execve('/usr/bin/ssh', ssh_args, os.environ) + except: + print traceback.print_exc() + print sys.exc_info() + + +def main(): + ossh = Ossh() + + +if __name__ == '__main__': + main() + diff --git a/bin/ossh.py b/bin/ossh.py deleted file mode 100755 index d0f4a1475..000000000 --- a/bin/ossh.py +++ /dev/null @@ -1,228 +0,0 @@ -#!/usr/bin/env python - -import pdb -import argparse -import ansibleutil -import traceback -import sys -import os -import re - - -# use dynamic inventory -# list instances -# symlinked to ~/bin -# list instances that match pattern -# python! - -# list environment stuff as well -# 3 states: -# - an exact match; return result -# - a partial match; return all regex results -# - no match; None - -class Ossh(object): - def __init__(self): - self.file_path = os.path.join(os.path.dirname(os.path.realpath(__file__))) - self.parse_cli_args() - self.ansible = ansibleutil.AnsibleUtil() - - self.host_inventory = self.get_hosts() - - - if self.args.debug: - print self.args - - # get a dict of host inventory - self.get_hosts() - - # parse host and user - self.process_host() - - # perform the SSH - if self.args.list: - self.list_hosts() - else: - self.ssh() - - def parse_cli_args(self): - parser = argparse.ArgumentParser(description='Openshift Online SSH Tool.') - parser.add_argument('-r', '--random', action="store", - help="Choose a random host") - 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, - action="store_true", help="Verbose?") - parser.add_argument('--list', default=False, - action="store_true", help="list out hosts") - parser.add_argument('host') - parser.add_argument('-c', '--command', action='store', - help='Command to run on remote host') - parser.add_argument('-l', '--login_name', action='store', - help='User in which to ssh as') - - parser.add_argument('-o', '--ssh_opts', action='store', - help='options to pass to SSH.\n \ - "-o ForwardX11 yes"') - - self.args = parser.parse_args() - - def process_host(self): - '''Determine host name and user name for SSH. - ''' - self.env = None - - re_env = re.compile('\.(int|stg|prod|ops)') - 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] - - # parse username if passed - if '@' in self.args.host: - self.user, self.host = self.args.host.split('@') - else: - self.host = self.args.host - if self.args.login_name: - self.user = self.args.login_name - else: - self.user = os.environ['USER'] - - - - def get_hosts(self): - '''Query our host inventory and return a dict where the format - equals: - - dict['servername'] = dns_name - ''' - # TODO: perform a numerical sort on these hosts - # and display them - self.host_inventory = self.ansible.build_host_dict() - - def select_host(self, regex=False): - '''select host attempts to match the host specified - on the command line with a list of hosts. - - if regex is specified then we will attempt to match - all *{host_string}* equivalents. - ''' -# list environment stuff as well -# 3 states: -# - an exact match; return result -# - a partial match; return all regex results -# - no match; None - re_host = re.compile(self.host) - - exact = [] - results = [] - for hostname, server_info in self.host_inventory[self.env].items(): - if hostname.split(':')[0] == self.host: - exact.append((hostname, server_info)) - break - elif re_host.search(hostname): - results.append((hostname, server_info)) - - if exact: - return exact - elif results: - return results - else: - print "Could not find specified host: %s in %s" % (self.host, self.env) - - # default - no results found. - return None - - - 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(True) - 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]: - name = server_info['ec2_tag_Name'] - ec2_id = server_info['ec2_id'] - ip = server_info['ec2_ip_address'] - print '{ec2_tag_Name:<35} {ec2_tag_environment:<8} {ec2_id:<15} {ec2_ip_address}'.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(): - name = server_info['ec2_tag_Name'] - ec2_id = server_info['ec2_id'] - ip = server_info['ec2_ip_address'] - print '{ec2_tag_Name:<35} {ec2_tag_environment:<5} {ec2_id:<15} {ec2_ip_address}'.format(**server_info) - - def ssh(self): - '''SSH to a specified host - ''' - try: - cmd = '/usr/bin/ssh' - ssh_args = [cmd, '-l%s' % self.user] - #ssh_args = [cmd, ] - - if self.args.verbose: - ssh_args.append('-vvv') - - if self.args.ssh_opts: - ssh_args.append("-o%s" % self.args.ssh_opts) - - result = self.select_host() - if not result: - return # early exit, no results - - if len(result) > 1: - self.list_hosts(10) - return # early exit, too many results - - # Assume we have one and only one. - hostname, server_info = result[0] - ip = server_info['ec2_ip_address'] - - ssh_args.append(ip) - - #last argument - if self.args.command: - ssh_args.append("%s" % self.args.command) - - if self.args.debug: - print "SSH to %s in %s as %s" % (hostname, self.env, self.user) - - print "Running: %s\n" % ' '.join(ssh_args) - - os.execve('/usr/bin/ssh', ssh_args, os.environ) - except: - print traceback.print_exc() - print sys.exc_info() - - -def main(): - ossh = Ossh() - - -if __name__ == '__main__': - main() - diff --git a/bin/ossh_bash_completion b/bin/ossh_bash_completion new file mode 100755 index 000000000..0d0bdb0e6 --- /dev/null +++ b/bin/ossh_bash_completion @@ -0,0 +1,18 @@ +__ossh_known_hosts(){ + if [[ -f ~/.ansible/tmp/multi_ec2_inventory.cache ]]; then + /usr/bin/python -c 'import json,os; z = json.loads(open("%s"%os.path.expanduser("~/.ansible/tmp/multi_ec2_inventory.cache")).read()); print "\n".join(["%s.%s" % (host["ec2_tag_Name"],host["ec2_tag_environment"]) for dns, host in z["_meta"]["hostvars"].items()])' + fi +} + +_ossh() +{ + local cur prev known_hosts + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + known_hosts="$(__ossh_known_hosts)" + COMPREPLY=( $(compgen -W "${known_hosts}" -- ${cur})) + + return 0 +} +complete -F _ossh ossh -- cgit v1.2.3 From d124436d94a1e502f7f31a6958d01a513c8cb1a5 Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Wed, 4 Feb 2015 13:37:34 -0500 Subject: Adding [tab] completion for bash and zsh. --- bin/COMPLETION_SETUP | 25 ++++++++++++++++++------- bin/_ossh_zsh_completion | 20 ++++++++++++++++++++ bin/ossh | 10 +++++++--- 3 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 bin/_ossh_zsh_completion (limited to 'bin') diff --git a/bin/COMPLETION_SETUP b/bin/COMPLETION_SETUP index c11a2dfff..0183544e6 100644 --- a/bin/COMPLETION_SETUP +++ b/bin/COMPLETION_SETUP @@ -1,17 +1,11 @@ # ossh is an ssh replacement. + Ossh uses a dynamic inventory cache in order to lookup hostnames and translate them to something meaningful such as an IP address or dns name. This allows us to treat our servers as cattle and not as pets. -In order to setup bash completion, source the following script: -/path/to/repository/openshift-online-ansible/bin/ossh_bash_completion - -This bash_completion script will look at the cached version of your -multi_ec2 results in ~/.ansible/tmp/. It will then parse a few -host.env out of the json and return them to be completable. - If you have not run the ossh command and it has not laid down a cache file the completions will not be available. @@ -19,3 +13,20 @@ You can populate the cache by running `ossh --list`. This will populate the cache file and the completions should become available. +This zsh script will look at the cached version of your +multi_ec2 results in ~/.ansible/tmp/. It will then parse a few +{host}.{env} out of the json and return them to be completable. + +# BASH +In order to setup bash completion, source the following script: +/path/to/repository/openshift-online-ansible/bin/ossh_bash_completion + +# ZSH +In order to setup zsh completion, you will need to verify +that the _ossh_zsh_completion script is somewhere in the path +of $fpath. + +Once $fpath includes the _ossh_zsh_completion script then you should +run `exec zsh`. This will then allow you to call `ossh host[TAB]` +for a list of completions. + diff --git a/bin/_ossh_zsh_completion b/bin/_ossh_zsh_completion new file mode 100644 index 000000000..05352bbbb --- /dev/null +++ b/bin/_ossh_zsh_completion @@ -0,0 +1,20 @@ +#compdef ossh + +_ossh_known_hosts(){ + if [[ -f ~/.ansible/tmp/multi_ec2_inventory.cache ]]; then + /usr/bin/python -c 'import json,os; z = json.loads(open("%s"%os.path.expanduser("~/.ansible/tmp/multi_ec2_inventory.cache")).read()); print "\n".join(["%s.%s" % (host["ec2_tag_Name"],host["ec2_tag_environment"]) for dns, host in z["_meta"]["hostvars"].items()])' + fi + +} +_ossh(){ + local curcontext="$curcontext" state line + typeset -A opt_args + + _arguments -s : \ + "*:Hosts:_ossh_known_hosts" + + case $state in + *) + +} +_ossh "$@" diff --git a/bin/ossh b/bin/ossh index 2fa4bde37..1cef1b4fa 100755 --- a/bin/ossh +++ b/bin/ossh @@ -26,6 +26,13 @@ class Ossh(object): self.file_path = os.path.join(os.path.dirname(os.path.realpath(__file__))) self.parse_cli_args() + # parse host and user + self.process_host() + + if not self.args.list and not self.env: + print "Please specify an environment." + return + if self.args.host == '' and not self.args.list: self.parser.print_help() return @@ -34,15 +41,12 @@ class Ossh(object): self.host_inventory = self.get_hosts() - if self.args.debug: print self.args # get a dict of host inventory self.get_hosts() - # parse host and user - self.process_host() # perform the SSH if self.args.list: -- cgit v1.2.3 From 912ba64e80dc3e086df4e9b65577fe490ff37c70 Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Thu, 5 Feb 2015 10:57:06 -0500 Subject: Fixed zsh completion. --- bin/_ossh_zsh_completion | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'bin') diff --git a/bin/_ossh_zsh_completion b/bin/_ossh_zsh_completion index 05352bbbb..f057ca8ce 100644 --- a/bin/_ossh_zsh_completion +++ b/bin/_ossh_zsh_completion @@ -2,7 +2,7 @@ _ossh_known_hosts(){ if [[ -f ~/.ansible/tmp/multi_ec2_inventory.cache ]]; then - /usr/bin/python -c 'import json,os; z = json.loads(open("%s"%os.path.expanduser("~/.ansible/tmp/multi_ec2_inventory.cache")).read()); print "\n".join(["%s.%s" % (host["ec2_tag_Name"],host["ec2_tag_environment"]) for dns, host in z["_meta"]["hostvars"].items()])' + print $(/usr/bin/python -c 'import json,os; z = json.loads(open("%s"%os.path.expanduser("~/.ansible/tmp/multi_ec2_inventory.cache")).read()); print "\n".join(["%s.%s" % (host["ec2_tag_Name"],host["ec2_tag_environment"]) for dns, host in z["_meta"]["hostvars"].items()])') fi } @@ -10,11 +10,15 @@ _ossh(){ local curcontext="$curcontext" state line typeset -A opt_args - _arguments -s : \ - "*:Hosts:_ossh_known_hosts" +#_arguments "*:Hosts:_ossh_known_hosts" + _arguments -s : \ + "*:hosts:->hosts" + + case "$state" in + hosts) + _values 'hosts' $(_ossh_known_hosts) + ;; + esac - case $state in - *) - } _ossh "$@" -- cgit v1.2.3 From 55b7f22404da7a0cfcdbce467e9581f6b8509320 Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Thu, 5 Feb 2015 14:18:09 -0500 Subject: Updated tab completion as well as respecting ssh config files. --- bin/COMPLETION_SETUP | 32 -------------------------------- bin/README_SHELL_COMPLETION | 32 ++++++++++++++++++++++++++++++++ bin/_ossh_zsh_completion | 24 ------------------------ bin/ossh | 17 +++++++++-------- bin/ossh_zsh_completion | 24 ++++++++++++++++++++++++ 5 files changed, 65 insertions(+), 64 deletions(-) delete mode 100644 bin/COMPLETION_SETUP create mode 100644 bin/README_SHELL_COMPLETION delete mode 100644 bin/_ossh_zsh_completion create mode 100644 bin/ossh_zsh_completion (limited to 'bin') diff --git a/bin/COMPLETION_SETUP b/bin/COMPLETION_SETUP deleted file mode 100644 index 0183544e6..000000000 --- a/bin/COMPLETION_SETUP +++ /dev/null @@ -1,32 +0,0 @@ -# ossh is an ssh replacement. - - -Ossh uses a dynamic inventory cache in order to lookup hostnames and translate them -to something meaningful such as an IP address or dns name. - -This allows us to treat our servers as cattle and not as pets. - -If you have not run the ossh command and it has not laid down -a cache file the completions will not be available. - -You can populate the cache by running `ossh --list`. This -will populate the cache file and the completions should -become available. - -This zsh script will look at the cached version of your -multi_ec2 results in ~/.ansible/tmp/. It will then parse a few -{host}.{env} out of the json and return them to be completable. - -# BASH -In order to setup bash completion, source the following script: -/path/to/repository/openshift-online-ansible/bin/ossh_bash_completion - -# ZSH -In order to setup zsh completion, you will need to verify -that the _ossh_zsh_completion script is somewhere in the path -of $fpath. - -Once $fpath includes the _ossh_zsh_completion script then you should -run `exec zsh`. This will then allow you to call `ossh host[TAB]` -for a list of completions. - diff --git a/bin/README_SHELL_COMPLETION b/bin/README_SHELL_COMPLETION new file mode 100644 index 000000000..0183544e6 --- /dev/null +++ b/bin/README_SHELL_COMPLETION @@ -0,0 +1,32 @@ +# ossh is an ssh replacement. + + +Ossh uses a dynamic inventory cache in order to lookup hostnames and translate them +to something meaningful such as an IP address or dns name. + +This allows us to treat our servers as cattle and not as pets. + +If you have not run the ossh command and it has not laid down +a cache file the completions will not be available. + +You can populate the cache by running `ossh --list`. This +will populate the cache file and the completions should +become available. + +This zsh script will look at the cached version of your +multi_ec2 results in ~/.ansible/tmp/. It will then parse a few +{host}.{env} out of the json and return them to be completable. + +# BASH +In order to setup bash completion, source the following script: +/path/to/repository/openshift-online-ansible/bin/ossh_bash_completion + +# ZSH +In order to setup zsh completion, you will need to verify +that the _ossh_zsh_completion script is somewhere in the path +of $fpath. + +Once $fpath includes the _ossh_zsh_completion script then you should +run `exec zsh`. This will then allow you to call `ossh host[TAB]` +for a list of completions. + diff --git a/bin/_ossh_zsh_completion b/bin/_ossh_zsh_completion deleted file mode 100644 index f057ca8ce..000000000 --- a/bin/_ossh_zsh_completion +++ /dev/null @@ -1,24 +0,0 @@ -#compdef ossh - -_ossh_known_hosts(){ - if [[ -f ~/.ansible/tmp/multi_ec2_inventory.cache ]]; then - print $(/usr/bin/python -c 'import json,os; z = json.loads(open("%s"%os.path.expanduser("~/.ansible/tmp/multi_ec2_inventory.cache")).read()); print "\n".join(["%s.%s" % (host["ec2_tag_Name"],host["ec2_tag_environment"]) for dns, host in z["_meta"]["hostvars"].items()])') - fi - -} -_ossh(){ - local curcontext="$curcontext" state line - typeset -A opt_args - -#_arguments "*:Hosts:_ossh_known_hosts" - _arguments -s : \ - "*:hosts:->hosts" - - case "$state" in - hosts) - _values 'hosts' $(_ossh_known_hosts) - ;; - esac - -} -_ossh "$@" diff --git a/bin/ossh b/bin/ossh index 1cef1b4fa..7f7acc6c2 100755 --- a/bin/ossh +++ b/bin/ossh @@ -84,6 +84,7 @@ class Ossh(object): '''Determine host name and user name for SSH. ''' self.env = None + self.user = None re_env = re.compile('\.(int|stg|prod|ops)') search = re_env.search(self.args.host) @@ -104,10 +105,6 @@ class Ossh(object): self.host = self.args.host if self.args.login_name: self.user = self.args.login_name - else: - self.user = os.environ['USER'] - - def get_hosts(self): '''Query our host inventory and return a dict where the format @@ -192,8 +189,12 @@ class Ossh(object): ''' try: cmd = '/usr/bin/ssh' - ssh_args = [cmd, '-l%s' % self.user] - #ssh_args = [cmd, ] + + # shell args start with the program name in position 1 + ssh_args = [cmd, ] + + if self.user: + ssh_args.append('-l%s' % self.user) if self.args.verbose: ssh_args.append('-vvv') @@ -211,9 +212,9 @@ class Ossh(object): # Assume we have one and only one. hostname, server_info = result[0] - ip = server_info['ec2_ip_address'] + dns = server_info['ec2_public_dns_name'] - ssh_args.append(ip) + ssh_args.append(dns) #last argument if self.args.command: diff --git a/bin/ossh_zsh_completion b/bin/ossh_zsh_completion new file mode 100644 index 000000000..f057ca8ce --- /dev/null +++ b/bin/ossh_zsh_completion @@ -0,0 +1,24 @@ +#compdef ossh + +_ossh_known_hosts(){ + if [[ -f ~/.ansible/tmp/multi_ec2_inventory.cache ]]; then + print $(/usr/bin/python -c 'import json,os; z = json.loads(open("%s"%os.path.expanduser("~/.ansible/tmp/multi_ec2_inventory.cache")).read()); print "\n".join(["%s.%s" % (host["ec2_tag_Name"],host["ec2_tag_environment"]) for dns, host in z["_meta"]["hostvars"].items()])') + fi + +} +_ossh(){ + local curcontext="$curcontext" state line + typeset -A opt_args + +#_arguments "*:Hosts:_ossh_known_hosts" + _arguments -s : \ + "*:hosts:->hosts" + + case "$state" in + hosts) + _values 'hosts' $(_ossh_known_hosts) + ;; + esac + +} +_ossh "$@" -- cgit v1.2.3 From ee96928a2d1c21c5d2319418f4cf6ca774a3e010 Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Thu, 5 Feb 2015 16:02:36 -0500 Subject: Attempting to only refresh cache when doing --list on ossh. --- bin/ansibleutil.py | 10 +++++++--- bin/ossh | 18 +++++++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) (limited to 'bin') diff --git a/bin/ansibleutil.py b/bin/ansibleutil.py index ed35ef8f9..6df3e7126 100644 --- a/bin/ansibleutil.py +++ b/bin/ansibleutil.py @@ -11,8 +11,12 @@ class AnsibleUtil(object): self.file_path = os.path.join(os.path.dirname(os.path.realpath(__file__))) self.multi_ec2_path = os.path.realpath(os.path.join(self.file_path, '..','inventory','multi_ec2.py')) - def get_inventory(self): + def get_inventory(self,args=[]): cmd = [self.multi_ec2_path] + + if args: + cmd.extend(args) + env = {} p = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE, env=env) @@ -50,8 +54,8 @@ class AnsibleUtil(object): return groups - def build_host_dict(self): - inv = self.get_inventory() + def build_host_dict(self, args=[]): + inv = self.get_inventory(args) inst_by_env = {} for dns, host in inv['_meta']['hostvars'].items(): diff --git a/bin/ossh b/bin/ossh index 7f7acc6c2..1fa987d21 100755 --- a/bin/ossh +++ b/bin/ossh @@ -39,15 +39,15 @@ class Ossh(object): self.ansible = ansibleutil.AnsibleUtil() - self.host_inventory = self.get_hosts() + # get a dict of host inventory + if self.args.list: + self.get_hosts() + else: + self.get_hosts(True) if self.args.debug: print self.args - # get a dict of host inventory - self.get_hosts() - - # perform the SSH if self.args.list: self.list_hosts() @@ -106,7 +106,7 @@ class Ossh(object): if self.args.login_name: self.user = self.args.login_name - def get_hosts(self): + def get_hosts(self, cache=False): '''Query our host inventory and return a dict where the format equals: @@ -114,7 +114,11 @@ class Ossh(object): ''' # TODO: perform a numerical sort on these hosts # and display them - self.host_inventory = self.ansible.build_host_dict() + + if not cache: + self.host_inventory = self.ansible.build_host_dict() + else: + self.host_inventory = self.ansible.build_host_dict(['--cache-only']) def select_host(self, regex=False): '''select host attempts to match the host specified -- cgit v1.2.3 From cedef18d9450a1b3c8c0f72c10174735529cda04 Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Thu, 5 Feb 2015 17:01:06 -0500 Subject: Removed comments and cleaned up code. --- bin/README_SHELL_COMPLETION | 11 ++++--- bin/ansibleutil.py | 2 -- bin/opssh.py | 66 --------------------------------------- bin/ossh | 75 +++++++++++++-------------------------------- 4 files changed, 28 insertions(+), 126 deletions(-) delete mode 100755 bin/opssh.py (limited to 'bin') diff --git a/bin/README_SHELL_COMPLETION b/bin/README_SHELL_COMPLETION index 0183544e6..e17b4b205 100644 --- a/bin/README_SHELL_COMPLETION +++ b/bin/README_SHELL_COMPLETION @@ -1,7 +1,7 @@ # ossh is an ssh replacement. -Ossh uses a dynamic inventory cache in order to lookup hostnames and translate them +ossh uses a dynamic inventory cache in order to lookup hostnames and translate them to something meaningful such as an IP address or dns name. This allows us to treat our servers as cattle and not as pets. @@ -13,9 +13,10 @@ You can populate the cache by running `ossh --list`. This will populate the cache file and the completions should become available. -This zsh script will look at the cached version of your -multi_ec2 results in ~/.ansible/tmp/. It will then parse a few -{host}.{env} out of the json and return them to be completable. +This script will look at the cached version of your +multi_ec2 results in ~/.ansible/tmp/multi_ec2_inventory.cache. +It will then parse a few {host}.{env} out of the json +and return them to be completable. # BASH In order to setup bash completion, source the following script: @@ -27,6 +28,6 @@ that the _ossh_zsh_completion script is somewhere in the path of $fpath. Once $fpath includes the _ossh_zsh_completion script then you should -run `exec zsh`. This will then allow you to call `ossh host[TAB]` +run `exec zsh`. This will then allow you to call `ossh host[TAB]` for a list of completions. diff --git a/bin/ansibleutil.py b/bin/ansibleutil.py index 6df3e7126..b12b7b447 100644 --- a/bin/ansibleutil.py +++ b/bin/ansibleutil.py @@ -26,8 +26,6 @@ class AnsibleUtil(object): if p.returncode != 0: raise RuntimeError(err) - #with open('/tmp/ans.out','w') as fd: - #fd.writelines(out) return json.loads(out.strip()) def get_environments(self): diff --git a/bin/opssh.py b/bin/opssh.py deleted file mode 100755 index 6ee390c4c..000000000 --- a/bin/opssh.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python -# vim: expandtab:tabstop=4:shiftwidth=4 - -import argparse -import os -import ansibleutil -import sys - -class Program(object): - def __init__(self): - self.file_path = os.path.join(os.path.dirname(os.path.realpath(__file__))) - self.parse_cli_args() - self.ansible = ansibleutil.AnsibleUtil() - - inv = self.ansible.get_inventory() - #print inv.keys() - #sys.exit() - - if self.args.list_environments: - self.list_environments() - sys.exit() - - if self.args.list_groups: - self.list_security_groups() - sys.exit() - - def parse_cli_args(self): - parser = argparse.ArgumentParser( - description='OpenShift Online Operations Parallel SSH' - ) - - parser.add_argument("-v", '--verbosity', action="count", - help="increase output verbosity") - - group = parser.add_mutually_exclusive_group() - - group.add_argument('--list-environments', action="store_true", - help='List all environments') - group.add_argument('--list-groups', action="store_true", - help='List all security groups') - group.add_argument('-e', '--environment', - help='Set the environment') - - self.args = parser.parse_args() - - def list_environments(self): - envs = self.ansible.get_environments() - print - print "Environments" - print "------------" - for env in envs: - print env - print - - def list_security_groups(self): - envs = self.ansible.get_security_groups() - print - print "Groups" - print "------" - for env in envs: - print env - print - - -if __name__ == '__main__': - p = Program() diff --git a/bin/ossh b/bin/ossh index 1fa987d21..f41eedadf 100755 --- a/bin/ossh +++ b/bin/ossh @@ -1,6 +1,6 @@ #!/usr/bin/env python +# vim: expandtab:tabstop=4:shiftwidth=4 -import pdb import argparse import ansibleutil import traceback @@ -8,24 +8,19 @@ import sys import os import re - -# use dynamic inventory -# list instances -# symlinked to ~/bin -# list instances that match pattern -# python! - -# list environment stuff as well -# 3 states: -# - an exact match; return result -# - a partial match; return all regex results -# - no match; None - class Ossh(object): def __init__(self): self.file_path = os.path.join(os.path.dirname(os.path.realpath(__file__))) self.parse_cli_args() + self.ansible = ansibleutil.AnsibleUtil() + + # get a dict of host inventory + if self.args.list: + self.get_hosts() + else: + self.get_hosts(True) + # parse host and user self.process_host() @@ -37,13 +32,6 @@ class Ossh(object): self.parser.print_help() return - self.ansible = ansibleutil.AnsibleUtil() - - # get a dict of host inventory - if self.args.list: - self.get_hosts() - else: - self.get_hosts(True) if self.args.debug: print self.args @@ -56,8 +44,6 @@ class Ossh(object): def parse_cli_args(self): parser = argparse.ArgumentParser(description='Openshift Online SSH Tool.') - parser.add_argument('-r', '--random', action="store", - help="Choose a random host") parser.add_argument('-e', '--env', action="store", help="Which environment to search for the host ") parser.add_argument('-d', '--debug', default=False, @@ -73,7 +59,7 @@ class Ossh(object): parser.add_argument('-o', '--ssh_opts', action='store', help='options to pass to SSH.\n \ - "-o ForwardX11 yes"') + "-oForwardX11=yes,TCPKeepAlive=yes"') parser.add_argument('host', nargs='?', default='') self.args = parser.parse_args() @@ -86,7 +72,7 @@ class Ossh(object): self.env = None self.user = None - re_env = re.compile('\.(int|stg|prod|ops)') + 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 @@ -106,19 +92,16 @@ class Ossh(object): if self.args.login_name: self.user = self.args.login_name - def get_hosts(self, cache=False): + def get_hosts(self, cache_only=False): '''Query our host inventory and return a dict where the format equals: dict['servername'] = dns_name ''' - # TODO: perform a numerical sort on these hosts - # and display them - - if not cache: - self.host_inventory = self.ansible.build_host_dict() - else: + if cache_only: self.host_inventory = self.ansible.build_host_dict(['--cache-only']) + else: + self.host_inventory = self.ansible.build_host_dict() def select_host(self, regex=False): '''select host attempts to match the host specified @@ -127,25 +110,17 @@ class Ossh(object): if regex is specified then we will attempt to match all *{host_string}* equivalents. ''' -# list environment stuff as well -# 3 states: -# - an exact match; return result -# - a partial match; return all regex results -# - no match; None re_host = re.compile(self.host) - exact = [] results = [] for hostname, server_info in self.host_inventory[self.env].items(): if hostname.split(':')[0] == self.host: - exact.append((hostname, server_info)) - break + # an exact match, return it! + return [(hostname, server_info)] elif re_host.search(hostname): results.append((hostname, server_info)) - if exact: - return exact - elif results: + if results: return results else: print "Could not find specified host: %s in %s" % (self.host, self.env) @@ -153,7 +128,6 @@ class Ossh(object): # default - no results found. return None - def list_hosts(self, limit=None): '''Function to print out the host inventory. @@ -192,10 +166,8 @@ class Ossh(object): '''SSH to a specified host ''' try: - cmd = '/usr/bin/ssh' - # shell args start with the program name in position 1 - ssh_args = [cmd, ] + ssh_args = ['/usr/bin/ssh'] if self.user: ssh_args.append('-l%s' % self.user) @@ -204,7 +176,8 @@ class Ossh(object): ssh_args.append('-vvv') if self.args.ssh_opts: - ssh_args.append("-o%s" % self.args.ssh_opts) + for arg in self.args.ssh_opts.split(","): + ssh_args.append("-o%s" % arg) result = self.select_host() if not result: @@ -235,10 +208,6 @@ class Ossh(object): print sys.exc_info() -def main(): - ossh = Ossh() - - if __name__ == '__main__': - main() + ossh = Ossh() -- cgit v1.2.3 From 04582ead281239524df87f1dabc53125038ff9a5 Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Thu, 5 Feb 2015 17:01:52 -0500 Subject: Removed unneeded debug statement. --- bin/ossh | 3 --- 1 file changed, 3 deletions(-) (limited to 'bin') diff --git a/bin/ossh b/bin/ossh index f41eedadf..0b48ca46c 100755 --- a/bin/ossh +++ b/bin/ossh @@ -197,9 +197,6 @@ class Ossh(object): if self.args.command: ssh_args.append("%s" % self.args.command) - if self.args.debug: - print "SSH to %s in %s as %s" % (hostname, self.env, self.user) - print "Running: %s\n" % ' '.join(ssh_args) os.execve('/usr/bin/ssh', ssh_args, os.environ) -- cgit v1.2.3