From 6e63cca390fc48177c491656fee3d85c6e8d8225 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Wed, 13 Apr 2016 13:35:13 -0400 Subject: [PATCH 01/24] WIP - generic role generator --- ansible-dk-cli/ansible-dk | 32 ++++++++++++++++++++++++++++++-- generate-role.yml | 25 +++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 generate-role.yml diff --git a/ansible-dk-cli/ansible-dk b/ansible-dk-cli/ansible-dk index b9cae83..93922d2 100755 --- a/ansible-dk-cli/ansible-dk +++ b/ansible-dk-cli/ansible-dk @@ -6,6 +6,12 @@ import click import os import sys import json +from tempfile import NamedTemporaryFile +from ansible.executor import playbook_executor +from ansible.inventory import Inventory +from ansible.parsing.dataloader import DataLoader +from ansible.vars import VariableManager +from collections import namedtuple ################################################### # Defaults @@ -112,8 +118,30 @@ def generate_playbook(name): @generate.command(name='role') @click.option('--name', required=True, help='Name of role to generate') -def generate_role(name): - print("Generating role: ", name) +@click.option('--playbook', default='generate-role.yml', help='path to custom role generator playbook') +def generate_role(name, playbook): + print "Generating role named %s using playbook %s" % (name, playbook) + run_ansible(playbook, {'role_name': name}) + +def run_ansible(playbook, vars): + if not os.path.exists(playbook): + print 'Error - specified role generator playbook does not exist' + sys.exit() + Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check', 'listhosts', 'listtasks', 'listtags', 'syntax', 'remote_user', 'private_key_file', 'ssh_common_args', 'sftp_extra_args', 'scp_extra_args', 'ssh_extra_args', 'verbosity']) + options = Options(connection='local', module_path=None, forks=100, become=None, become_method=None, become_user=None, check=False, listhosts=False, listtasks=False, listtags=False, syntax=False, remote_user=None, private_key_file=None, ssh_common_args=None, sftp_extra_args=None, scp_extra_args=None, ssh_extra_args=None, verbosity=None) + loader = DataLoader() + variable_manager = VariableManager() + inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list='localhost') + variable_manager.set_inventory(inventory) + variable_manager.extra_vars = vars + playbook_executor.PlaybookExecutor( + playbooks=[playbook], + inventory=inventory, + options=options, + loader=loader, + variable_manager=variable_manager, + passwords=dict() + ).run() ################################################### # Call main CLI diff --git a/generate-role.yml b/generate-role.yml new file mode 100644 index 0000000..3b6503d --- /dev/null +++ b/generate-role.yml @@ -0,0 +1,25 @@ +--- +- hosts: localhost + connection: local + vars: + role_name: example + role_path: "." + role_subdirectories: + - tasks + - handlers + - templates + - files + - vars + - meta + tasks: + + - name: create top level role directory + file: state=directory path="{{ role_path }}/{{ role_name }}" recurse=yes + + - name: create subdirectories + file: state=directory path="{{ role_path }}/{{ role_name }}/{{ item }}" + with_items: "{{ role_subdirectories }}" + + - name: create main.yml files + copy: content="---\n" dest="{{ role_path }}/{{ role_name }}/{{ item }}/main.yml" + with_items: "{{ role_subdirectories }}" From 5355eee85ef49c982420ca8e4c0b3e956c42992e Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Wed, 13 Apr 2016 17:55:27 -0400 Subject: [PATCH 02/24] generators folder --- generate-role.yml => generators/role.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename generate-role.yml => generators/role.yml (100%) diff --git a/generate-role.yml b/generators/role.yml similarity index 100% rename from generate-role.yml rename to generators/role.yml From 8135af12fac31cf64215c7b7cd679d8219f917d8 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Wed, 13 Apr 2016 18:09:46 -0400 Subject: [PATCH 03/24] make extra_vars optional --- ansible-dk-cli/ansible-dk | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ansible-dk-cli/ansible-dk b/ansible-dk-cli/ansible-dk index 93922d2..3c0828b 100755 --- a/ansible-dk-cli/ansible-dk +++ b/ansible-dk-cli/ansible-dk @@ -123,7 +123,7 @@ def generate_role(name, playbook): print "Generating role named %s using playbook %s" % (name, playbook) run_ansible(playbook, {'role_name': name}) -def run_ansible(playbook, vars): +def run_ansible(playbook, vars=None): if not os.path.exists(playbook): print 'Error - specified role generator playbook does not exist' sys.exit() @@ -133,7 +133,8 @@ def run_ansible(playbook, vars): variable_manager = VariableManager() inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list='localhost') variable_manager.set_inventory(inventory) - variable_manager.extra_vars = vars + if vars: + variable_manager.extra_vars = vars playbook_executor.PlaybookExecutor( playbooks=[playbook], inventory=inventory, From 50c584bfa34ebaede6153ffae35a1466bfb3b8c7 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Wed, 13 Apr 2016 19:31:20 -0400 Subject: [PATCH 04/24] added some dummy generator playbooks --- generators/config.yml | 6 ++++++ generators/filter.yml | 6 ++++++ generators/inventory.yml | 6 ++++++ generators/playbook.yml | 6 ++++++ generators/repo.yml | 6 ++++++ 5 files changed, 30 insertions(+) create mode 100644 generators/config.yml create mode 100644 generators/filter.yml create mode 100644 generators/inventory.yml create mode 100644 generators/playbook.yml create mode 100644 generators/repo.yml diff --git a/generators/config.yml b/generators/config.yml new file mode 100644 index 0000000..34db7ba --- /dev/null +++ b/generators/config.yml @@ -0,0 +1,6 @@ +--- +- hosts: localhost + connection: local + tasks: + - debug: msg="running dummy config generator playbook" + diff --git a/generators/filter.yml b/generators/filter.yml new file mode 100644 index 0000000..763fa43 --- /dev/null +++ b/generators/filter.yml @@ -0,0 +1,6 @@ +--- +- hosts: localhost + connection: local + tasks: + - debug: msg="running dummy filter generator playbook" + diff --git a/generators/inventory.yml b/generators/inventory.yml new file mode 100644 index 0000000..d8444aa --- /dev/null +++ b/generators/inventory.yml @@ -0,0 +1,6 @@ +--- +- hosts: localhost + connection: local + tasks: + - debug: msg="running dummy inventory generator playbook" + diff --git a/generators/playbook.yml b/generators/playbook.yml new file mode 100644 index 0000000..70e6b22 --- /dev/null +++ b/generators/playbook.yml @@ -0,0 +1,6 @@ +--- +- hosts: localhost + connection: local + tasks: + - debug: msg="running dummy playbook generator playbook" + diff --git a/generators/repo.yml b/generators/repo.yml new file mode 100644 index 0000000..5dc5880 --- /dev/null +++ b/generators/repo.yml @@ -0,0 +1,6 @@ +--- +- hosts: localhost + connection: local + tasks: + - debug: msg="running dummy repo generator playbook" + From 864ba016eb6e6e0911f75edc4de9d21da037fe29 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Wed, 13 Apr 2016 21:28:27 -0400 Subject: [PATCH 05/24] generic generator subcommands --- ansible-dk-cli/ansible-dk | 67 +++++++++++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 9 deletions(-) diff --git a/ansible-dk-cli/ansible-dk b/ansible-dk-cli/ansible-dk index 3c0828b..5812d85 100755 --- a/ansible-dk-cli/ansible-dk +++ b/ansible-dk-cli/ansible-dk @@ -111,17 +111,66 @@ def verify(): def generate(): pass -@generate.command(name='playbook') -@click.option('--name', required=True, help='Name of playbook to generate') -def generate_playbook(name): - print("Generating playbook: ", name) + +#TODO: absolute path and check a config file for default generator repo path +_generator_options = [ + click.option('--debug', is_flag=True, help="Enable debug mode"), + click.option('--generator-repo', '-g', default='generators/', help='Path to custom generator repo'), + click.argument('path', type=click.Path()) +] +def generator_options(fn): + for option in _generator_options: + fn = option(fn) + return fn + +#TODO: generate these dynamically +@generate.command(name='repo') +@generator_options +def generate_repo(debug, generator_repo, path): + playbook_path = generator_repo + '/repo.yml' + if debug: + click.echo('generating repo using %s' % playbook_path) + run_ansible(playbook_path, {'repo_path': path}) @generate.command(name='role') -@click.option('--name', required=True, help='Name of role to generate') -@click.option('--playbook', default='generate-role.yml', help='path to custom role generator playbook') -def generate_role(name, playbook): - print "Generating role named %s using playbook %s" % (name, playbook) - run_ansible(playbook, {'role_name': name}) +@generator_options +def generate_role(debug, generator_repo, path): + playbook_path = generator_repo + '/role.yml' + if debug: + click.echo('generating role using %s' % playbook_path) + run_ansible(playbook_path, {'role_path': path}) + +@generate.command(name='filter') +@generator_options +def generate_filter(debug, generator_repo, path): + playbook_path = generator_repo + '/filter.yml' + if debug: + click.echo('generating filter using %s' % playbook_path) + run_ansible(playbook_path, {'filter_path': path}) + +@generate.command(name='inventory') +@generator_options +def generate_inventory(debug, generator_repo, path): + playbook_path = generator_repo + '/inventory.yml' + if debug: + click.echo('generating inventory using %s' % playbook_path) + run_ansible(playbook_path, {'inventory_path': path}) + +@generate.command(name='config') +@generator_options +def generate_config(debug, generator_repo, path): + playbook_path = generator_repo + '/config.yml' + if debug: + click.echo('generating config using %s' % playbook_path) + run_ansible(playbook_path, {'config_path': path}) + +@generate.command(name='playbook') +@generator_options +def generate_playbook(debug, generator_repo, path): + playbook_path = generator_repo + '/playbook.yml' + if debug: + click.echo('generating playbook using %s' % playbook_path) + run_ansible(playbook_path, {'playbook_path': path}) def run_ansible(playbook, vars=None): if not os.path.exists(playbook): From 310bb6d8813c73e386e8576ac95100c9fd4f182e Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Wed, 13 Apr 2016 21:28:57 -0400 Subject: [PATCH 06/24] fix role generator to conform to new format --- generators/role.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/generators/role.yml b/generators/role.yml index 3b6503d..9146490 100644 --- a/generators/role.yml +++ b/generators/role.yml @@ -2,8 +2,6 @@ - hosts: localhost connection: local vars: - role_name: example - role_path: "." role_subdirectories: - tasks - handlers @@ -14,12 +12,12 @@ tasks: - name: create top level role directory - file: state=directory path="{{ role_path }}/{{ role_name }}" recurse=yes + file: state=directory path="{{ role_path }}" recurse=yes - name: create subdirectories - file: state=directory path="{{ role_path }}/{{ role_name }}/{{ item }}" + file: state=directory path="{{ role_path }}/{{ item }}" with_items: "{{ role_subdirectories }}" - name: create main.yml files - copy: content="---\n" dest="{{ role_path }}/{{ role_name }}/{{ item }}/main.yml" + copy: content="---\n" dest="{{ role_path }}/{{ item }}/main.yml" with_items: "{{ role_subdirectories }}" From b6b7662c9571107d3c104766be68a4de35ac7099 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Wed, 13 Apr 2016 22:19:20 -0400 Subject: [PATCH 07/24] load config from ~/.ansible-dk/config --- ansible-dk-cli/ansible-dk | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/ansible-dk-cli/ansible-dk b/ansible-dk-cli/ansible-dk index 5812d85..6e217b0 100755 --- a/ansible-dk-cli/ansible-dk +++ b/ansible-dk-cli/ansible-dk @@ -6,6 +6,7 @@ import click import os import sys import json +import yaml from tempfile import NamedTemporaryFile from ansible.executor import playbook_executor from ansible.inventory import Inventory @@ -19,6 +20,30 @@ RUBY_ABI = "2.1.0" PYTHON_ABI = "2.7" HOME = os.getenv("HOME") +def get_config(debug=False): + #TODO: pass debug properly + config_path=os.path.expanduser('~/.ansible-dk/config') + #TODO: absolute path for default generator repo + config = { + 'generator': { + 'repo': 'generators/' + } + } + if os.path.isfile(config_path): + try: + config.update(yaml.load(open(config_path, 'r'))) + if debug: + click.echo("Loaded config from %s:\n%s" % (config_path, config)) + return config + except: + if debug: + click.echo("Error loading config file %s" % config_path) + return config + else: + if debug: + click.echo("No config file found at %s" % config_path) + return config + # pull version from version-manifest file left by package install def check_version(): file='/opt/ansible-dk/version-manifest.json' @@ -111,11 +136,9 @@ def verify(): def generate(): pass - -#TODO: absolute path and check a config file for default generator repo path _generator_options = [ click.option('--debug', is_flag=True, help="Enable debug mode"), - click.option('--generator-repo', '-g', default='generators/', help='Path to custom generator repo'), + click.option('--generator-repo', '-g', default=get_config()['generator']['repo'], help='Path to custom generator repo'), click.argument('path', type=click.Path()) ] def generator_options(fn): From 150476432e0c9f857c6ba53ef4de091289206793 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Thu, 14 Apr 2016 19:24:41 -0400 Subject: [PATCH 08/24] change --generator-repo to just --generator --- ansible-dk-cli/ansible-dk | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/ansible-dk-cli/ansible-dk b/ansible-dk-cli/ansible-dk index 6e217b0..d901015 100755 --- a/ansible-dk-cli/ansible-dk +++ b/ansible-dk-cli/ansible-dk @@ -138,7 +138,7 @@ def generate(): _generator_options = [ click.option('--debug', is_flag=True, help="Enable debug mode"), - click.option('--generator-repo', '-g', default=get_config()['generator']['repo'], help='Path to custom generator repo'), + click.option('--generator', '-g', default=get_config()['generator'], help='Path to custom generator repo'), click.argument('path', type=click.Path()) ] def generator_options(fn): @@ -149,48 +149,48 @@ def generator_options(fn): #TODO: generate these dynamically @generate.command(name='repo') @generator_options -def generate_repo(debug, generator_repo, path): - playbook_path = generator_repo + '/repo.yml' +def generate_repo(debug, generator, path): + playbook_path = generator + '/repo.yml' if debug: click.echo('generating repo using %s' % playbook_path) run_ansible(playbook_path, {'repo_path': path}) @generate.command(name='role') @generator_options -def generate_role(debug, generator_repo, path): - playbook_path = generator_repo + '/role.yml' +def generate_role(debug, generator, path): + playbook_path = generator + '/role.yml' if debug: click.echo('generating role using %s' % playbook_path) run_ansible(playbook_path, {'role_path': path}) @generate.command(name='filter') @generator_options -def generate_filter(debug, generator_repo, path): - playbook_path = generator_repo + '/filter.yml' +def generate_filter(debug, generator, path): + playbook_path = generator + '/filter.yml' if debug: click.echo('generating filter using %s' % playbook_path) run_ansible(playbook_path, {'filter_path': path}) @generate.command(name='inventory') @generator_options -def generate_inventory(debug, generator_repo, path): - playbook_path = generator_repo + '/inventory.yml' +def generate_inventory(debug, generator, path): + playbook_path = generator + '/inventory.yml' if debug: click.echo('generating inventory using %s' % playbook_path) run_ansible(playbook_path, {'inventory_path': path}) @generate.command(name='config') @generator_options -def generate_config(debug, generator_repo, path): - playbook_path = generator_repo + '/config.yml' +def generate_config(debug, generator, path): + playbook_path = generator + '/config.yml' if debug: click.echo('generating config using %s' % playbook_path) run_ansible(playbook_path, {'config_path': path}) @generate.command(name='playbook') @generator_options -def generate_playbook(debug, generator_repo, path): - playbook_path = generator_repo + '/playbook.yml' +def generate_playbook(debug, generator, path): + playbook_path = generator + '/playbook.yml' if debug: click.echo('generating playbook using %s' % playbook_path) run_ansible(playbook_path, {'playbook_path': path}) From ae2bc0421f1e10a5c12182a0fcc26f0ee3da80ab Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Thu, 14 Apr 2016 19:37:42 -0400 Subject: [PATCH 09/24] change path to name --- ansible-dk-cli/ansible-dk | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/ansible-dk-cli/ansible-dk b/ansible-dk-cli/ansible-dk index d901015..ef8a6fc 100755 --- a/ansible-dk-cli/ansible-dk +++ b/ansible-dk-cli/ansible-dk @@ -139,7 +139,7 @@ def generate(): _generator_options = [ click.option('--debug', is_flag=True, help="Enable debug mode"), click.option('--generator', '-g', default=get_config()['generator'], help='Path to custom generator repo'), - click.argument('path', type=click.Path()) + click.argument('name') ] def generator_options(fn): for option in _generator_options: @@ -149,51 +149,51 @@ def generator_options(fn): #TODO: generate these dynamically @generate.command(name='repo') @generator_options -def generate_repo(debug, generator, path): +def generate_repo(debug, generator, name): playbook_path = generator + '/repo.yml' if debug: click.echo('generating repo using %s' % playbook_path) - run_ansible(playbook_path, {'repo_path': path}) + run_ansible(playbook_path, {'repo_name': name}) @generate.command(name='role') @generator_options -def generate_role(debug, generator, path): +def generate_role(debug, generator, name): playbook_path = generator + '/role.yml' if debug: click.echo('generating role using %s' % playbook_path) - run_ansible(playbook_path, {'role_path': path}) + run_ansible(playbook_path, {'role_name': name}) @generate.command(name='filter') @generator_options -def generate_filter(debug, generator, path): +def generate_filter(debug, generator, name): playbook_path = generator + '/filter.yml' if debug: click.echo('generating filter using %s' % playbook_path) - run_ansible(playbook_path, {'filter_path': path}) + run_ansible(playbook_path, {'filter_name': name}) @generate.command(name='inventory') @generator_options -def generate_inventory(debug, generator, path): +def generate_inventory(debug, generator, name): playbook_path = generator + '/inventory.yml' if debug: click.echo('generating inventory using %s' % playbook_path) - run_ansible(playbook_path, {'inventory_path': path}) + run_ansible(playbook_path, {'inventory_name': name}) @generate.command(name='config') @generator_options -def generate_config(debug, generator, path): +def generate_config(debug, generator, name): playbook_path = generator + '/config.yml' if debug: click.echo('generating config using %s' % playbook_path) - run_ansible(playbook_path, {'config_path': path}) + run_ansible(playbook_path, {'config_name': name}) @generate.command(name='playbook') @generator_options -def generate_playbook(debug, generator, path): +def generate_playbook(debug, generator, name): playbook_path = generator + '/playbook.yml' if debug: click.echo('generating playbook using %s' % playbook_path) - run_ansible(playbook_path, {'playbook_path': path}) + run_ansible(playbook_path, {'playbook_name': name}) def run_ansible(playbook, vars=None): if not os.path.exists(playbook): From f278ca93884697a475d1d509e9e2d0f9fd6339d4 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Thu, 14 Apr 2016 19:43:09 -0400 Subject: [PATCH 10/24] role_path is now role_name --- generators/role.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/generators/role.yml b/generators/role.yml index 9146490..7f5e08c 100644 --- a/generators/role.yml +++ b/generators/role.yml @@ -12,12 +12,12 @@ tasks: - name: create top level role directory - file: state=directory path="{{ role_path }}" recurse=yes + file: state=directory path="{{ role_name }}" recurse=yes - name: create subdirectories - file: state=directory path="{{ role_path }}/{{ item }}" + file: state=directory path="{{ role_name }}/{{ item }}" with_items: "{{ role_subdirectories }}" - name: create main.yml files - copy: content="---\n" dest="{{ role_path }}/{{ item }}/main.yml" + copy: content="---\n" dest="{{ role_name }}/{{ item }}/main.yml" with_items: "{{ role_subdirectories }}" From 317620ca9c467944f3286ee3c6b723efa0df8921 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Thu, 14 Apr 2016 19:43:32 -0400 Subject: [PATCH 11/24] show name of thing being generated in debug output --- ansible-dk-cli/ansible-dk | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ansible-dk-cli/ansible-dk b/ansible-dk-cli/ansible-dk index ef8a6fc..a6b5fc5 100755 --- a/ansible-dk-cli/ansible-dk +++ b/ansible-dk-cli/ansible-dk @@ -152,7 +152,7 @@ def generator_options(fn): def generate_repo(debug, generator, name): playbook_path = generator + '/repo.yml' if debug: - click.echo('generating repo using %s' % playbook_path) + click.echo('generating repo named %s using %s' % (name, playbook_path)) run_ansible(playbook_path, {'repo_name': name}) @generate.command(name='role') @@ -160,7 +160,7 @@ def generate_repo(debug, generator, name): def generate_role(debug, generator, name): playbook_path = generator + '/role.yml' if debug: - click.echo('generating role using %s' % playbook_path) + click.echo('generating role named %s using %s' % (name, playbook_path)) run_ansible(playbook_path, {'role_name': name}) @generate.command(name='filter') @@ -168,7 +168,7 @@ def generate_role(debug, generator, name): def generate_filter(debug, generator, name): playbook_path = generator + '/filter.yml' if debug: - click.echo('generating filter using %s' % playbook_path) + click.echo('generating filter named %s using %s' % (name, playbook_path)) run_ansible(playbook_path, {'filter_name': name}) @generate.command(name='inventory') @@ -176,7 +176,7 @@ def generate_filter(debug, generator, name): def generate_inventory(debug, generator, name): playbook_path = generator + '/inventory.yml' if debug: - click.echo('generating inventory using %s' % playbook_path) + click.echo('generating inventory named %s using %s' % (name, playbook_path)) run_ansible(playbook_path, {'inventory_name': name}) @generate.command(name='config') @@ -184,7 +184,7 @@ def generate_inventory(debug, generator, name): def generate_config(debug, generator, name): playbook_path = generator + '/config.yml' if debug: - click.echo('generating config using %s' % playbook_path) + click.echo('generating config named %s using %s' % (name, playbook_path)) run_ansible(playbook_path, {'config_name': name}) @generate.command(name='playbook') @@ -192,7 +192,7 @@ def generate_config(debug, generator, name): def generate_playbook(debug, generator, name): playbook_path = generator + '/playbook.yml' if debug: - click.echo('generating playbook using %s' % playbook_path) + click.echo('generating playbook named %s using %s' % (name, playbook_path)) run_ansible(playbook_path, {'playbook_name': name}) def run_ansible(playbook, vars=None): From 83aecbb165763c768f7c5e4e08492999bb4babb0 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Thu, 14 Apr 2016 23:41:54 -0400 Subject: [PATCH 12/24] take extra vars and pass them to ansible-playbook, in the same format ansible does --- ansible-dk-cli/ansible-dk | 47 +++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/ansible-dk-cli/ansible-dk b/ansible-dk-cli/ansible-dk index a6b5fc5..f6c0d4e 100755 --- a/ansible-dk-cli/ansible-dk +++ b/ansible-dk-cli/ansible-dk @@ -139,6 +139,7 @@ def generate(): _generator_options = [ click.option('--debug', is_flag=True, help="Enable debug mode"), click.option('--generator', '-g', default=get_config()['generator'], help='Path to custom generator repo'), + click.option('-e', multiple=True, help='extra vars to pass to ansible, var=value'), click.argument('name') ] def generator_options(fn): @@ -146,54 +147,76 @@ def generator_options(fn): fn = option(fn) return fn +def parse_extra_vars(e): + extra_vars = {} + for var in e: + try: + key, value = var.split('=') + except ValueError: + click.echo('extra args must be in the format var=value') + sys.exit() + extra_vars[key] = value + return extra_vars #TODO: generate these dynamically @generate.command(name='repo') @generator_options -def generate_repo(debug, generator, name): +def generate_repo(debug, generator, name, e): + extra_vars = parse_extra_vars(e) + extra_vars['repo_name'] = name playbook_path = generator + '/repo.yml' if debug: click.echo('generating repo named %s using %s' % (name, playbook_path)) - run_ansible(playbook_path, {'repo_name': name}) + run_ansible(playbook_path, extra_vars) @generate.command(name='role') @generator_options -def generate_role(debug, generator, name): +def generate_role(debug, generator, name, e): + extra_vars = parse_extra_vars(e) + extra_vars['role_name'] = name playbook_path = generator + '/role.yml' if debug: click.echo('generating role named %s using %s' % (name, playbook_path)) - run_ansible(playbook_path, {'role_name': name}) + run_ansible(playbook_path, extra_vars) @generate.command(name='filter') @generator_options -def generate_filter(debug, generator, name): +def generate_filter(debug, generator, name, e): + extra_vars = parse_extra_vars(e) + extra_vars['filter_name'] = name playbook_path = generator + '/filter.yml' if debug: click.echo('generating filter named %s using %s' % (name, playbook_path)) - run_ansible(playbook_path, {'filter_name': name}) + run_ansible(playbook_path, extra_vars) @generate.command(name='inventory') @generator_options -def generate_inventory(debug, generator, name): +def generate_inventory(debug, generator, name, e): + extra_vars = parse_extra_vars(e) + extra_vars['inventory_name'] = name playbook_path = generator + '/inventory.yml' if debug: click.echo('generating inventory named %s using %s' % (name, playbook_path)) - run_ansible(playbook_path, {'inventory_name': name}) + run_ansible(playbook_path, extra_vars) @generate.command(name='config') @generator_options -def generate_config(debug, generator, name): +def generate_config(debug, generator, name, e): + extra_vars = parse_extra_vars(e) + extra_vars['config_name'] = name playbook_path = generator + '/config.yml' if debug: click.echo('generating config named %s using %s' % (name, playbook_path)) - run_ansible(playbook_path, {'config_name': name}) + run_ansible(playbook_path, extra_vars) @generate.command(name='playbook') @generator_options -def generate_playbook(debug, generator, name): +def generate_playbook(debug, generator, name, e): + extra_vars = parse_extra_vars(e) + extra_vars['playbook_name'] = name playbook_path = generator + '/playbook.yml' if debug: click.echo('generating playbook named %s using %s' % (name, playbook_path)) - run_ansible(playbook_path, {'playbook_name': name}) + run_ansible(playbook_path, extra_vars) def run_ansible(playbook, vars=None): if not os.path.exists(playbook): From d8b97e4fca21433e90f639884950e71570b8ca99 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Mon, 18 Apr 2016 13:22:25 -0400 Subject: [PATCH 13/24] validate extra_vars with proper callback --- ansible-dk-cli/ansible-dk | 40 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/ansible-dk-cli/ansible-dk b/ansible-dk-cli/ansible-dk index f6c0d4e..594a17c 100755 --- a/ansible-dk-cli/ansible-dk +++ b/ansible-dk-cli/ansible-dk @@ -136,10 +136,20 @@ def verify(): def generate(): pass +def parse_extra_vars(context, param, e): + extra_vars = {} + for var in e: + try: + key, value = var.split('=') + except ValueError: + raise click.BadParameter('must be in the format var=value') + extra_vars[key] = value + return extra_vars + _generator_options = [ click.option('--debug', is_flag=True, help="Enable debug mode"), click.option('--generator', '-g', default=get_config()['generator'], help='Path to custom generator repo'), - click.option('-e', multiple=True, help='extra vars to pass to ansible, var=value'), + click.option('-e', 'extra_vars', multiple=True, callback=parse_extra_vars, help='extra vars to pass to ansible, var=value'), click.argument('name') ] def generator_options(fn): @@ -147,21 +157,10 @@ def generator_options(fn): fn = option(fn) return fn -def parse_extra_vars(e): - extra_vars = {} - for var in e: - try: - key, value = var.split('=') - except ValueError: - click.echo('extra args must be in the format var=value') - sys.exit() - extra_vars[key] = value - return extra_vars #TODO: generate these dynamically @generate.command(name='repo') @generator_options -def generate_repo(debug, generator, name, e): - extra_vars = parse_extra_vars(e) +def generate_repo(debug, generator, name, extra_vars): extra_vars['repo_name'] = name playbook_path = generator + '/repo.yml' if debug: @@ -170,8 +169,7 @@ def generate_repo(debug, generator, name, e): @generate.command(name='role') @generator_options -def generate_role(debug, generator, name, e): - extra_vars = parse_extra_vars(e) +def generate_role(debug, generator, name, extra_vars): extra_vars['role_name'] = name playbook_path = generator + '/role.yml' if debug: @@ -180,8 +178,7 @@ def generate_role(debug, generator, name, e): @generate.command(name='filter') @generator_options -def generate_filter(debug, generator, name, e): - extra_vars = parse_extra_vars(e) +def generate_filter(debug, generator, name, extra_vars): extra_vars['filter_name'] = name playbook_path = generator + '/filter.yml' if debug: @@ -190,8 +187,7 @@ def generate_filter(debug, generator, name, e): @generate.command(name='inventory') @generator_options -def generate_inventory(debug, generator, name, e): - extra_vars = parse_extra_vars(e) +def generate_inventory(debug, generator, name, extra_vars): extra_vars['inventory_name'] = name playbook_path = generator + '/inventory.yml' if debug: @@ -200,8 +196,7 @@ def generate_inventory(debug, generator, name, e): @generate.command(name='config') @generator_options -def generate_config(debug, generator, name, e): - extra_vars = parse_extra_vars(e) +def generate_config(debug, generator, name, extra_vars): extra_vars['config_name'] = name playbook_path = generator + '/config.yml' if debug: @@ -210,8 +205,7 @@ def generate_config(debug, generator, name, e): @generate.command(name='playbook') @generator_options -def generate_playbook(debug, generator, name, e): - extra_vars = parse_extra_vars(e) +def generate_playbook(debug, generator, name, extra_vars): extra_vars['playbook_name'] = name playbook_path = generator + '/playbook.yml' if debug: From 58a3bdd08089671a0da485e47059365260732bf6 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Mon, 18 Apr 2016 13:59:50 -0400 Subject: [PATCH 14/24] updated software definition for ansible-dk cli --- config/software/ansible-dk-cli.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/software/ansible-dk-cli.rb b/config/software/ansible-dk-cli.rb index 92e9537..455a5a2 100644 --- a/config/software/ansible-dk-cli.rb +++ b/config/software/ansible-dk-cli.rb @@ -1,8 +1,7 @@ name "ansible-dk-cli" default_version "0.1.0" # This is just to silence a warning -description "One day this might be a generic CLI tool; today it is a hack to make shell-init work" +description "generic CLI tool for ansible-dk" -# This isn't used yet (as we're a shell script, derp) but will be soon! dependency 'click' build do From 751036ba86e2adf668e6a46239354e29b1d9deff Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Mon, 18 Apr 2016 14:00:35 -0400 Subject: [PATCH 15/24] added software definition for generators --- config/projects/ansible-dk.rb | 1 + config/software/generators.rb | 7 +++++++ 2 files changed, 8 insertions(+) create mode 100644 config/software/generators.rb diff --git a/config/projects/ansible-dk.rb b/config/projects/ansible-dk.rb index b7de1bd..c2f4ae5 100644 --- a/config/projects/ansible-dk.rb +++ b/config/projects/ansible-dk.rb @@ -42,6 +42,7 @@ dependency "python" dependency "pip" dependency "ansible-dk-cli" +dependency "generators" dependency "awscli" dependency "ansible" dependency "ansible-lint" diff --git a/config/software/generators.rb b/config/software/generators.rb new file mode 100644 index 0000000..8815136 --- /dev/null +++ b/config/software/generators.rb @@ -0,0 +1,7 @@ +name "generators" +default_version "0.1.0" # This is just to silence a warning +description "a set of generic playbooks for the ansible-dk generator" + +build do + copy Dir.pwd + "/generators", "#{install_dir}/" +end From 1354920a4917685dd831de627580ccb4c3964a15 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Mon, 18 Apr 2016 14:04:35 -0400 Subject: [PATCH 16/24] absolute path for default generators --- ansible-dk-cli/ansible-dk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible-dk-cli/ansible-dk b/ansible-dk-cli/ansible-dk index 594a17c..eb66b15 100755 --- a/ansible-dk-cli/ansible-dk +++ b/ansible-dk-cli/ansible-dk @@ -26,7 +26,7 @@ def get_config(debug=False): #TODO: absolute path for default generator repo config = { 'generator': { - 'repo': 'generators/' + 'repo': '/opt/ansible-dk/generators/' } } if os.path.isfile(config_path): From fd795d48e4ec0a90b86bbd37be859b37f1405e61 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Mon, 18 Apr 2016 17:13:21 -0400 Subject: [PATCH 17/24] rename generators software definition to ansible-dk-generators and make it a dependency of ansible-dk-cli --- config/projects/ansible-dk.rb | 1 - config/software/ansible-dk-cli.rb | 1 + config/software/{generators.rb => ansible-dk-generators.rb} | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename config/software/{generators.rb => ansible-dk-generators.rb} (86%) diff --git a/config/projects/ansible-dk.rb b/config/projects/ansible-dk.rb index c2f4ae5..b7de1bd 100644 --- a/config/projects/ansible-dk.rb +++ b/config/projects/ansible-dk.rb @@ -42,7 +42,6 @@ dependency "python" dependency "pip" dependency "ansible-dk-cli" -dependency "generators" dependency "awscli" dependency "ansible" dependency "ansible-lint" diff --git a/config/software/ansible-dk-cli.rb b/config/software/ansible-dk-cli.rb index 455a5a2..c55c4ca 100644 --- a/config/software/ansible-dk-cli.rb +++ b/config/software/ansible-dk-cli.rb @@ -3,6 +3,7 @@ description "generic CLI tool for ansible-dk" dependency 'click' +dependency 'ansible-dk-generators' build do copy Dir.pwd + "/ansible-dk-cli/ansible-dk", "#{install_dir}/embedded/bin" diff --git a/config/software/generators.rb b/config/software/ansible-dk-generators.rb similarity index 86% rename from config/software/generators.rb rename to config/software/ansible-dk-generators.rb index 8815136..405805b 100644 --- a/config/software/generators.rb +++ b/config/software/ansible-dk-generators.rb @@ -1,4 +1,4 @@ -name "generators" +name "ansible-dk-generators" default_version "0.1.0" # This is just to silence a warning description "a set of generic playbooks for the ansible-dk generator" From c958b402675d868188d42de263768c78f6f26432 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Mon, 18 Apr 2016 23:23:38 -0400 Subject: [PATCH 18/24] dynamically generate subcommands --- ansible-dk-cli/ansible-dk | 82 ++++++++------------------------------- 1 file changed, 17 insertions(+), 65 deletions(-) diff --git a/ansible-dk-cli/ansible-dk b/ansible-dk-cli/ansible-dk index eb66b15..9c11f7c 100755 --- a/ansible-dk-cli/ansible-dk +++ b/ansible-dk-cli/ansible-dk @@ -146,71 +146,23 @@ def parse_extra_vars(context, param, e): extra_vars[key] = value return extra_vars -_generator_options = [ - click.option('--debug', is_flag=True, help="Enable debug mode"), - click.option('--generator', '-g', default=get_config()['generator'], help='Path to custom generator repo'), - click.option('-e', 'extra_vars', multiple=True, callback=parse_extra_vars, help='extra vars to pass to ansible, var=value'), - click.argument('name') -] -def generator_options(fn): - for option in _generator_options: - fn = option(fn) - return fn - -#TODO: generate these dynamically -@generate.command(name='repo') -@generator_options -def generate_repo(debug, generator, name, extra_vars): - extra_vars['repo_name'] = name - playbook_path = generator + '/repo.yml' - if debug: - click.echo('generating repo named %s using %s' % (name, playbook_path)) - run_ansible(playbook_path, extra_vars) - -@generate.command(name='role') -@generator_options -def generate_role(debug, generator, name, extra_vars): - extra_vars['role_name'] = name - playbook_path = generator + '/role.yml' - if debug: - click.echo('generating role named %s using %s' % (name, playbook_path)) - run_ansible(playbook_path, extra_vars) - -@generate.command(name='filter') -@generator_options -def generate_filter(debug, generator, name, extra_vars): - extra_vars['filter_name'] = name - playbook_path = generator + '/filter.yml' - if debug: - click.echo('generating filter named %s using %s' % (name, playbook_path)) - run_ansible(playbook_path, extra_vars) - -@generate.command(name='inventory') -@generator_options -def generate_inventory(debug, generator, name, extra_vars): - extra_vars['inventory_name'] = name - playbook_path = generator + '/inventory.yml' - if debug: - click.echo('generating inventory named %s using %s' % (name, playbook_path)) - run_ansible(playbook_path, extra_vars) - -@generate.command(name='config') -@generator_options -def generate_config(debug, generator, name, extra_vars): - extra_vars['config_name'] = name - playbook_path = generator + '/config.yml' - if debug: - click.echo('generating config named %s using %s' % (name, playbook_path)) - run_ansible(playbook_path, extra_vars) - -@generate.command(name='playbook') -@generator_options -def generate_playbook(debug, generator, name, extra_vars): - extra_vars['playbook_name'] = name - playbook_path = generator + '/playbook.yml' - if debug: - click.echo('generating playbook named %s using %s' % (name, playbook_path)) - run_ansible(playbook_path, extra_vars) +def generate_method(thing): + @generate.command(name=thing) + @click.option('--debug', is_flag=True, help="Enable debug mode") + @click.option('--generator', '-g', default=get_config()['generator'], help='Path to custom generator repo') + @click.option('-e', 'extra_vars', multiple=True, callback=parse_extra_vars, help='extra vars to pass to ansible, var=value') + @click.argument('name') + def generated_method(debug, generator, name, extra_vars): + extra_vars[thing+'_name'] = name + playbook_path = "%s/%s.yml" % (generator, thing) + if debug: + click.echo('generating %s named %s using %s' % (thing, name, playbook_path)) + run_ansible(playbook_path, extra_vars) + return generated_method + +generate_things = ['repo', 'role', 'filter', 'inventory', 'config', 'playbook'] +for thing in generate_things: + generate_method(thing) def run_ansible(playbook, vars=None): if not os.path.exists(playbook): From 5f8325f6a642ba3d0712a9a19d3fc010ab9c58a8 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Tue, 19 Apr 2016 12:16:24 -0400 Subject: [PATCH 19/24] unique method names for better stack traces --- ansible-dk-cli/ansible-dk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible-dk-cli/ansible-dk b/ansible-dk-cli/ansible-dk index 9c11f7c..863f659 100755 --- a/ansible-dk-cli/ansible-dk +++ b/ansible-dk-cli/ansible-dk @@ -158,7 +158,7 @@ def generate_method(thing): if debug: click.echo('generating %s named %s using %s' % (thing, name, playbook_path)) run_ansible(playbook_path, extra_vars) - return generated_method + generated_method.__name__ = 'generate_%s' % thing generate_things = ['repo', 'role', 'filter', 'inventory', 'config', 'playbook'] for thing in generate_things: From 7ea9f1a6ed8980bc151600b361340e829ce1fb76 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Thu, 21 Apr 2016 13:58:05 -0400 Subject: [PATCH 20/24] fix default generator config --- ansible-dk-cli/ansible-dk | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ansible-dk-cli/ansible-dk b/ansible-dk-cli/ansible-dk index 863f659..dc9df9a 100755 --- a/ansible-dk-cli/ansible-dk +++ b/ansible-dk-cli/ansible-dk @@ -23,11 +23,8 @@ HOME = os.getenv("HOME") def get_config(debug=False): #TODO: pass debug properly config_path=os.path.expanduser('~/.ansible-dk/config') - #TODO: absolute path for default generator repo config = { - 'generator': { - 'repo': '/opt/ansible-dk/generators/' - } + 'generator': '/opt/ansible-dk/generators/' } if os.path.isfile(config_path): try: From bd1539fe58e59a7bb0ec3b521d4eb7ef575d66f8 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Thu, 21 Apr 2016 14:02:41 -0400 Subject: [PATCH 21/24] add .yml extension to config file --- ansible-dk-cli/ansible-dk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible-dk-cli/ansible-dk b/ansible-dk-cli/ansible-dk index dc9df9a..dcdd486 100755 --- a/ansible-dk-cli/ansible-dk +++ b/ansible-dk-cli/ansible-dk @@ -22,7 +22,7 @@ HOME = os.getenv("HOME") def get_config(debug=False): #TODO: pass debug properly - config_path=os.path.expanduser('~/.ansible-dk/config') + config_path=os.path.expanduser('~/.ansible-dk/config.yml') config = { 'generator': '/opt/ansible-dk/generators/' } From 177f0686a1a10124c4c39de36110d4e7e15cb6b3 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Thu, 21 Apr 2016 14:05:44 -0400 Subject: [PATCH 22/24] move default generators to default subdirectory --- ansible-dk-cli/ansible-dk | 2 +- generators/{ => default}/config.yml | 0 generators/{ => default}/filter.yml | 0 generators/{ => default}/inventory.yml | 0 generators/{ => default}/playbook.yml | 0 generators/{ => default}/repo.yml | 0 generators/{ => default}/role.yml | 0 7 files changed, 1 insertion(+), 1 deletion(-) rename generators/{ => default}/config.yml (100%) rename generators/{ => default}/filter.yml (100%) rename generators/{ => default}/inventory.yml (100%) rename generators/{ => default}/playbook.yml (100%) rename generators/{ => default}/repo.yml (100%) rename generators/{ => default}/role.yml (100%) diff --git a/ansible-dk-cli/ansible-dk b/ansible-dk-cli/ansible-dk index dcdd486..e393036 100755 --- a/ansible-dk-cli/ansible-dk +++ b/ansible-dk-cli/ansible-dk @@ -24,7 +24,7 @@ def get_config(debug=False): #TODO: pass debug properly config_path=os.path.expanduser('~/.ansible-dk/config.yml') config = { - 'generator': '/opt/ansible-dk/generators/' + 'generator': '/opt/ansible-dk/generators/default/' } if os.path.isfile(config_path): try: diff --git a/generators/config.yml b/generators/default/config.yml similarity index 100% rename from generators/config.yml rename to generators/default/config.yml diff --git a/generators/filter.yml b/generators/default/filter.yml similarity index 100% rename from generators/filter.yml rename to generators/default/filter.yml diff --git a/generators/inventory.yml b/generators/default/inventory.yml similarity index 100% rename from generators/inventory.yml rename to generators/default/inventory.yml diff --git a/generators/playbook.yml b/generators/default/playbook.yml similarity index 100% rename from generators/playbook.yml rename to generators/default/playbook.yml diff --git a/generators/repo.yml b/generators/default/repo.yml similarity index 100% rename from generators/repo.yml rename to generators/default/repo.yml diff --git a/generators/role.yml b/generators/default/role.yml similarity index 100% rename from generators/role.yml rename to generators/default/role.yml From 4821d00ffd4bc02016466133e350ddae9c1ad3dd Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Thu, 21 Apr 2016 14:25:37 -0400 Subject: [PATCH 23/24] pass debug to get_config --- ansible-dk-cli/ansible-dk | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ansible-dk-cli/ansible-dk b/ansible-dk-cli/ansible-dk index e393036..03ba514 100755 --- a/ansible-dk-cli/ansible-dk +++ b/ansible-dk-cli/ansible-dk @@ -21,10 +21,9 @@ PYTHON_ABI = "2.7" HOME = os.getenv("HOME") def get_config(debug=False): - #TODO: pass debug properly config_path=os.path.expanduser('~/.ansible-dk/config.yml') config = { - 'generator': '/opt/ansible-dk/generators/default/' + 'generator': '/opt/ansible-dk/generators/default' } if os.path.isfile(config_path): try: @@ -143,13 +142,16 @@ def parse_extra_vars(context, param, e): extra_vars[key] = value return extra_vars +# dynamically create generate subcommands def generate_method(thing): @generate.command(name=thing) @click.option('--debug', is_flag=True, help="Enable debug mode") - @click.option('--generator', '-g', default=get_config()['generator'], help='Path to custom generator repo') + @click.option('--generator', '-g', default=False, help='Path to custom generator repo') @click.option('-e', 'extra_vars', multiple=True, callback=parse_extra_vars, help='extra vars to pass to ansible, var=value') @click.argument('name') def generated_method(debug, generator, name, extra_vars): + if not generator: + generator = get_config(debug)['generator'] extra_vars[thing+'_name'] = name playbook_path = "%s/%s.yml" % (generator, thing) if debug: From 4ec570f4f1d1731335168765815fc0a421ce4936 Mon Sep 17 00:00:00 2001 From: Josh Blancett Date: Thu, 21 Apr 2016 17:24:39 -0400 Subject: [PATCH 24/24] documentation for generator --- GENERATE.md | 29 +++++++++++++++++++++++++++++ ansible-dk-cli/ansible-dk | 8 ++++---- 2 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 GENERATE.md diff --git a/GENERATE.md b/GENERATE.md new file mode 100644 index 0000000..c237e51 --- /dev/null +++ b/GENERATE.md @@ -0,0 +1,29 @@ +# ansible-dk generate + +An ansible-dk cli subcommand for generating skeleton Ansible code layouts + +### Usage: +>$ ansible-dk generate repo foo + +Would generate a skeleton ansible repo named foo by running a generator playbook +located at /opt/ansible-dk/generators/default/repo.yml + +Note: The default generators are still in development and in most cases don't do anything yet. + +### Custom Generators +You can supply custom generator playbooks. This can be done with a cli arg: +>$ ansible-dk generate repo -g /path/to/my/generators foo + +This would generate an ansible repo named foo using a playbook at /path/to/my/generators/repo.yml + +You can also set this in a config file so you won't have to pass it to the cli every time. +Add something like this to ~/.ansible-dk/config.yml: +``` +--- +generator: /path/to/my/generators +``` + +### Variables +By default all generator playbooks are passed a variable of [thing]_name. Example: repo_name +You can add custom variables to run with your playbooks in the same format you'd pass them to `ansible-playbooks`: +>$ ansible-dk generate repo foo -e foo=bar -e bar=foo diff --git a/ansible-dk-cli/ansible-dk b/ansible-dk-cli/ansible-dk index 03ba514..c95a9ab 100755 --- a/ansible-dk-cli/ansible-dk +++ b/ansible-dk-cli/ansible-dk @@ -128,7 +128,7 @@ def verify(): ################################################### # generate command -@cli.group() +@cli.group(help='A tool for generating skeleton Ansible code layouts. More info: https://github.com/omniti-labs/ansible-dk/blob/master/GENERATE.md') def generate(): pass @@ -144,10 +144,10 @@ def parse_extra_vars(context, param, e): # dynamically create generate subcommands def generate_method(thing): - @generate.command(name=thing) + @generate.command(name=thing, help='Generate ansible %s' % thing) @click.option('--debug', is_flag=True, help="Enable debug mode") - @click.option('--generator', '-g', default=False, help='Path to custom generator repo') - @click.option('-e', 'extra_vars', multiple=True, callback=parse_extra_vars, help='extra vars to pass to ansible, var=value') + @click.option('--generator', '-g', default=False, metavar='/opt/ansible-dk/generators/default', help='Path to custom generator repo') + @click.option('-e', 'extra_vars', multiple=True, callback=parse_extra_vars, metavar='var=value', help='extra vars to pass to ansible, multiple ok') @click.argument('name') def generated_method(debug, generator, name, extra_vars): if not generator: