From 7b9856bc0e80bc86f1c33e5f5a446c336bd42860 Mon Sep 17 00:00:00 2001 From: Michael DeHaan Date: Fri, 6 Apr 2012 10:59:15 -0400 Subject: [PATCH] Modification on top of skvidal's common options patch to keep options to command line tools sorted. --- bin/ansible | 23 ++++++++--- bin/ansible-playbook | 32 ++++++--------- lib/ansible/utils.py | 94 ++++++++++++++++++++++++++++---------------- 3 files changed, 91 insertions(+), 58 deletions(-) diff --git a/bin/ansible b/bin/ansible index 268ad37f6e4..4d0a3b9c4b6 100755 --- a/bin/ansible +++ b/bin/ansible @@ -47,12 +47,23 @@ class Cli(object): def parse(self): ''' create an options parser for bin/ansible ''' - 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 = { + '-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, + + ) + options, args = parser.parse_args() self.callbacks.options = options diff --git a/bin/ansible-playbook b/bin/ansible-playbook index 37f4dd4e38e..cb344ad92ac 100755 --- a/bin/ansible-playbook +++ b/bin/ansible-playbook @@ -32,13 +32,14 @@ def main(args): ''' run ansible-playbook operations ''' # create parser for CLI options - usage = "ans-playbook playbook.yml" - parser = utils.base_parser(constants=C, usage=usage) - parser.add_option('-e', '--extra-vars', dest='extra_vars', - help='pass in extra key=value variables from outside the playbook') - parser.add_option('-O', '--override-hosts', dest="override_hosts", default=None, - help="run playbook against only hosts, ignorning the inventory file") - + 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) options, args = parser.parse_args(args) if len(args) == 0: @@ -60,20 +61,13 @@ def main(args): runner_cb = callbacks.PlaybookRunnerCallbacks(stats) pb = ansible.playbook.PlayBook( - playbook=playbook, - host_list=options.inventory, + playbook=playbook,module_path=options.module_path, + host_list=options.inventory, override_hosts=override_hosts, extra_vars=options.extra_vars, - module_path=options.module_path, - forks=options.forks, - debug=options.debug, - verbose=True, - remote_pass=sshpass, - remote_port=options.remote_port, - callbacks=playbook_cb, - runner_callbacks=runner_cb, - stats=stats, + forks=options.forks, debug=options.debug, verbose=True, + remote_pass=sshpass, remote_port=options.remote_port, + callbacks=playbook_cb, runner_callbacks=runner_cb, stats=stats, timeout=options.timeout, - override_hosts=override_hosts, ) try: diff --git a/lib/ansible/utils.py b/lib/ansible/utils.py index ca0b88c5aa2..5eb5d07e5d0 100755 --- a/lib/ansible/utils.py +++ b/lib/ansible/utils.py @@ -23,8 +23,7 @@ import shlex import re import jinja2 import yaml -from optparse import OptionParser - +import optparse try: import json @@ -274,41 +273,70 @@ def parse_kv(args): options[k]=v return 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 = OptionParser(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') +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 ''' + + options = base_parser_options( + constants=constants, + output_opts=output_opts, + runas_opts=runas_opts, + async_opts=async_opts + ) + options.update(add_options) + + 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'), + } if output_opts: - 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') + 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') + }) if runas_opts: - 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') + 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'), + }) if async_opts: - 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') + 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'), + }) + + return options + - return parser