From 8ae71cc7b133b86fdaf5a508b81cc4b39c34235c Mon Sep 17 00:00:00 2001 From: Seth Vidal Date: Tue, 10 Apr 2012 13:51:58 -0400 Subject: [PATCH] go back to using a normal optparser to add options instead of the dict interface. add very small subclass of OptionParser to sort the options so mdehaan is happy --- bin/ansible | 23 +++-------- bin/ansible-playbook | 15 ++++--- lib/ansible/utils.py | 93 +++++++++++++++++--------------------------- 3 files changed, 49 insertions(+), 82 deletions(-) diff --git a/bin/ansible b/bin/ansible index 4d0a3b9c4b..268ad37f6e 100755 --- a/bin/ansible +++ b/bin/ansible @@ -47,23 +47,12 @@ class Cli(object): def parse(self): ''' create an options parser for bin/ansible ''' - - options = { - '-a' : dict(long='--args', dest='module_args', - help="module arguments", default=C.DEFAULT_MODULE_ARGS), - '-m' : dict(long='--module-name', dest='module_name', - help="module name to execute", default=C.DEFAULT_MODULE_NAME) - } - - parser = utils.make_parser( - options, - usage='ansible [options]', - runas_opts=True, - async_opts=True, - output_opts=True, - - ) - + parser = utils.base_parser(constants=C, runas_opts=True, async_opts=True, + output_opts=True, usage='ansible [options]') + parser.add_option('-a', '--args', dest='module_args', + help="module arguments", default=C.DEFAULT_MODULE_ARGS) + parser.add_option('-m', '--module-name', dest='module_name', + help="module name to execute", default=C.DEFAULT_MODULE_NAME) options, args = parser.parse_args() self.callbacks.options = options diff --git a/bin/ansible-playbook b/bin/ansible-playbook index cb344ad92a..34aafa6b9f 100755 --- a/bin/ansible-playbook +++ b/bin/ansible-playbook @@ -32,14 +32,13 @@ def main(args): ''' run ansible-playbook operations ''' # create parser for CLI options - usage = "ansible-playbook playbook.yml [options]" - options = { - '-e' : dict(long='--extra-vars', dest='extra_vars', - help='pass in extra key=value variables from outside the playbook'), - '-O' : dict(long='--override-hosts', dest="override_hosts", default=None, - help="run playbook against only hosts, ignorning the inventory file") - } - parser = utils.make_parser(options, constants=C, usage=usage) + usage = "ans-playbook playbook.yml" + parser = utils.base_parser(constants=C, usage=usage) + parser.add_option('-e', '--extra-vars', dest='extra_vars', + help='arguments to pass to the inventory script') + parser.add_option('-O', '--override-hosts', dest="override_hosts", default=None, + help="run playbook against these hosts regardless of inventory settings") + options, args = parser.parse_args(args) if len(args) == 0: diff --git a/lib/ansible/utils.py b/lib/ansible/utils.py index 5eb5d07e5d..450da6871c 100755 --- a/lib/ansible/utils.py +++ b/lib/ansible/utils.py @@ -24,7 +24,7 @@ import re import jinja2 import yaml import optparse - +from operator import methodcaller try: import json except ImportError: @@ -273,70 +273,49 @@ def parse_kv(args): options[k]=v return options -def make_parser(add_options, constants=C, usage="", output_opts=False, runas_opts=False, async_opts=False): - ''' create an options parser w/ common options for any ansible program ''' +class SortedOptParser(optparse.OptionParser): + '''Optparser which sorts the options by opt before outputting --help''' + def format_help(self, formatter=None): + self.option_list.sort(key=methodcaller('get_opt_string')) + return optparse.OptionParser.format_help(self, formatter=None) - options = base_parser_options( - constants=constants, - output_opts=output_opts, - runas_opts=runas_opts, - async_opts=async_opts - ) - options.update(add_options) +def base_parser(constants=C, usage="", output_opts=False, runas_opts=False, async_opts=False): + ''' create an options parser for any ansible script ''' - parser = optparse.OptionParser() - names = sorted(options.keys()) - for n in names: - data = options[n].copy() - long = data['long'] - del data['long'] - parser.add_option(n, long, **data) - return parser - -def base_parser_options(constants=C, output_opts=False, runas_opts=False, async_opts=False): - ''' creates common options for ansible programs ''' - - options = { - '-D': dict(long='--debug', default=False, action="store_true", - help='show debug/verbose module output'), - '-f': dict(long='--forks', dest='forks', default=constants.DEFAULT_FORKS, type='int', - help='number of parallel processes to use'), - '-i': dict(long='--inventory-file', dest='inventory', - help='path to inventory host file', default=constants.DEFAULT_HOST_LIST), - '-k': dict(long='--ask-pass', default=False, action='store_true', - help='ask for SSH password'), - '-M': dict(long='--module-path', dest='module_path', - help="path to module library directory", default=constants.DEFAULT_MODULE_PATH), - '-T': dict(long='--timeout', default=constants.DEFAULT_TIMEOUT, type='int', - dest='timeout', help='set the SSH connection timeout in seconds'), - '-p': dict(long='--port', default=constants.DEFAULT_REMOTE_PORT, type='int', - dest='remote_port', help='use this remote SSH port'), - } + parser = SortedOptParser(usage) + parser.add_option('-D','--debug', default=False, action="store_true", + help='enable standard error debugging of modules.') + parser.add_option('-f','--forks', dest='forks', default=constants.DEFAULT_FORKS, type='int', + help='number of parallel processes to use') + parser.add_option('-i', '--inventory-file', dest='inventory', + help='inventory host file', default=constants.DEFAULT_HOST_LIST) + parser.add_option('-k', '--ask-pass', default=False, action='store_true', + help='ask for SSH password') + parser.add_option('-M', '--module-path', dest='module_path', + help="path to module library", default=constants.DEFAULT_MODULE_PATH) + parser.add_option('-T', '--timeout', default=constants.DEFAULT_TIMEOUT, type='int', + dest='timeout', help='set the SSH timeout in seconds') + parser.add_option('-p', '--port', default=constants.DEFAULT_REMOTE_PORT, type='int', + dest='remote_port', help='set the remote ssh port') if output_opts: - options.update({ - '-o' : dict(long='--one-line', dest='one_line', action='store_true', - help='condense output'), - '-t' : dict(long='--tree', dest='tree', default=None, - help='log results to this directory') - }) + parser.add_option('-o', '--one-line', dest='one_line', action='store_true', + help='condense output') + parser.add_option('-t', '--tree', dest='tree', default=None, + help='log output to this directory') if runas_opts: - options.update({ - '-s' : dict(long="--sudo", default=False, action="store_true", - dest='sudo', help="run operations with sudo (nopasswd)"), - '-u' : dict(long='--user', default=constants.DEFAULT_REMOTE_USER, - dest='remote_user', help='connect as this user'), - }) + parser.add_option("-s", "--sudo", default=False, action="store_true", + dest='sudo', help="run operations with sudo (nopasswd)") + parser.add_option('-u', '--user', default=constants.DEFAULT_REMOTE_USER, + dest='remote_user', help='connect as this user') if async_opts: - options.update({ - '-P' : dict(long='--poll', default=constants.DEFAULT_POLL_INTERVAL, type='int', - dest='poll_interval', help='set the poll interval if using -B'), - '-B' : dict(long='--background', dest='seconds', type='int', default=0, - help='run asynchronously, failing after X seconds'), - }) + parser.add_option('-P', '--poll', default=constants.DEFAULT_POLL_INTERVAL, type='int', + dest='poll_interval', help='set the poll interval if using -B') + parser.add_option('-B', '--background', dest='seconds', type='int', default=0, + help='run asynchronously, failing after X seconds') - return options + return parser