diff --git a/bin/ansible-playbook b/bin/ansible-playbook index 6dd3a1cee78..f1263328cf3 100755 --- a/bin/ansible-playbook +++ b/bin/ansible-playbook @@ -35,6 +35,8 @@ def main(args): parser = utils.base_parser(constants=C, usage=usage, connect_opts=True, runas_opts=True) parser.add_option('-O', '--override-hosts', dest="override_hosts", default=None, help="run playbook against these hosts regardless of inventory settings") + parser.add_option('-e', '--extra-vars', dest="extra_vars", default=None, + help="set additional key=value variables from the CLI") options, args = parser.parse_args(args) @@ -51,6 +53,7 @@ def main(args): override_hosts = None if options.override_hosts: override_hosts = options.override_hosts.split(",") + extra_vars = utils.parse_kv(options.extra_vars) # run all playbooks specified on the command line for playbook in args: @@ -74,7 +77,8 @@ def main(args): timeout=options.timeout, transport=options.connection, sudo=options.sudo, - sudo_pass=sudopass + sudo_pass=sudopass, + extra_vars=extra_vars ) try: diff --git a/docs/man/man1/ansible-playbook.1 b/docs/man/man1/ansible-playbook.1 index 2128164371b..a62caab79b4 100644 --- a/docs/man/man1/ansible-playbook.1 +++ b/docs/man/man1/ansible-playbook.1 @@ -1,22 +1,13 @@ '\" t .\" Title: ansible-playbook .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 04/17/2012 +.\" Generator: DocBook XSL Stylesheets v1.75.2 +.\" Date: 04/26/2012 .\" Manual: System administration commands -.\" Source: Ansible 0.0.2 +.\" Source: Ansible 0.4 .\" Language: English .\" -.TH "ANSIBLE\-PLAYBOOK" "1" "04/17/2012" "Ansible 0\&.0\&.2" "System administration commands" -.\" ----------------------------------------------------------------- -.\" * Define some portability stuff -.\" ----------------------------------------------------------------- -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.\" http://bugs.debian.org/507673 -.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.ie \n(.g .ds Aq \(aq -.el .ds Aq ' +.TH "ANSIBLE\-PLAYBOOK" "1" "04/26/2012" "Ansible 0\&.4" "System administration commands" .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- @@ -63,6 +54,11 @@ to load modules from\&. The default is \fI/usr/share/ansible\fR\&. .RE .PP +\fB\-e\fR \fIVARS\fR, \fB\-\-extra\-vars=\fR\fIVARS\fR +.RS 4 +Extra variables to inject into a playbook, in key=value key=value format\&. +.RE +.PP \fB\-f\fR \fINUM\fR, \fB\-\-forks=\fR\fINUM\fR .RS 4 Level of parallelism\&. diff --git a/docs/man/man1/ansible-playbook.1.asciidoc.in b/docs/man/man1/ansible-playbook.1.asciidoc.in index e478ab60c89..2b2ab84d370 100644 --- a/docs/man/man1/ansible-playbook.1.asciidoc.in +++ b/docs/man/man1/ansible-playbook.1.asciidoc.in @@ -48,6 +48,9 @@ The 'PATH' to the inventory hosts file, which defaults to '/etc/ansible/hosts'. The 'DIRECTORY' to load modules from. The default is '/usr/share/ansible'. +*-e* 'VARS', *--extra-vars=*'VARS':: + +Extra variables to inject into a playbook, in key=value key=value format. *-f* 'NUM', *--forks=*'NUM':: diff --git a/docs/man/man1/ansible.1 b/docs/man/man1/ansible.1 index f5a6f37a1cb..27913bba712 100644 --- a/docs/man/man1/ansible.1 +++ b/docs/man/man1/ansible.1 @@ -1,22 +1,13 @@ '\" t .\" Title: ansible .\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.76.1 -.\" Date: 04/17/2012 +.\" Generator: DocBook XSL Stylesheets v1.75.2 +.\" Date: 04/26/2012 .\" Manual: System administration commands -.\" Source: Ansible 0.0.2 +.\" Source: Ansible 0.4 .\" Language: English .\" -.TH "ANSIBLE" "1" "04/17/2012" "Ansible 0\&.0\&.2" "System administration commands" -.\" ----------------------------------------------------------------- -.\" * Define some portability stuff -.\" ----------------------------------------------------------------- -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.\" http://bugs.debian.org/507673 -.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.ie \n(.g .ds Aq \(aq -.el .ds Aq ' +.TH "ANSIBLE" "1" "04/26/2012" "Ansible 0\&.4" "System administration commands" .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- @@ -34,7 +25,7 @@ ansible \- run a command somewhere else ansible [\-f forks] [\-m module_name] [\-a args] .SH "DESCRIPTION" .sp -\fBAnsible\fR is an extra\-simple tool/framework/API for doing \*(Aqremote things\*(Aq over SSH\&. +\fBAnsible\fR is an extra\-simple tool/framework/API for doing \'remote things\' over SSH\&. .SH "ARGUMENTS" .PP \fBhost\-pattern\fR @@ -72,7 +63,7 @@ to load modules from\&. The default is \fI/usr/share/ansible\fR\&. .RE .PP -\fB\-a\fR \*(Aq\fIARGUMENTS\fR\*(Aq, \fB\-\-args=\fR\*(Aq\fIARGUMENTS\fR\*(Aq +\fB\-a\fR \'\fIARGUMENTS\fR\', \fB\-\-args=\fR\'\fIARGUMENTS\fR\' .RS 4 The \fIARGUMENTS\fR diff --git a/lib/ansible/playbook.py b/lib/ansible/playbook.py index 102e307f94b..a8e6f0d834c 100644 --- a/lib/ansible/playbook.py +++ b/lib/ansible/playbook.py @@ -62,7 +62,8 @@ class PlayBook(object): callbacks = None, runner_callbacks = None, stats = None, - sudo = False): + sudo = False, + extra_vars = None): """ playbook: path to a playbook file @@ -85,6 +86,9 @@ class PlayBook(object): if playbook is None or callbacks is None or runner_callbacks is None or stats is None: raise Exception('missing required arguments') + if extra_vars is None: + extra_vars = {} + self.module_path = module_path self.forks = forks self.timeout = timeout @@ -99,6 +103,7 @@ class PlayBook(object): self.stats = stats self.sudo = sudo self.sudo_pass = sudo_pass + self.extra_vars = extra_vars self.basedir = os.path.dirname(playbook) self.playbook = self._parse_playbook(playbook) @@ -114,29 +119,32 @@ class PlayBook(object): def _get_vars(self, play, dirname): ''' load the vars section from a play ''' + if play.get('vars') is None: play['vars'] = {} - vars = play['vars'] - if type(vars) not in [dict, list]: + if type(play['vars']) not in [dict, list]: raise errors.AnsibleError("'vars' section must contain only key/value pairs") - + vars = {} + # translate a list of vars into a dict - if type(vars) == list: - varlist = vars - vars = {} - for item in varlist: + if type(play['vars']) == list: + for item in play['vars']: k, v = item.items()[0] vars[k] = v - play['vars'] = vars + else: + vars = play['vars'] vars_prompt = play.get('vars_prompt', {}) if type(vars_prompt) != dict: raise errors.AnsibleError("'vars_prompt' section must contain only key/value pairs") for vname in vars_prompt: + # TODO: make this prompt one line and consider double entry print vars_prompt[vname] - # FIXME - need some way to know that this prompt should be getpass or raw_input vars[vname] = self.callbacks.on_vars_prompt(vname) - return vars + + results = self.extra_vars.copy() + results.update(vars) + return results # ***************************************************** diff --git a/test/TestPlayBook.py b/test/TestPlayBook.py index 20a00c43cf4..05a486ca002 100644 --- a/test/TestPlayBook.py +++ b/test/TestPlayBook.py @@ -141,7 +141,7 @@ class TestPlaybook(unittest.TestCase): runner_callbacks = self.test_callbacks ) result = self.playbook.run() - print utils.bigjson(dict(events=EVENTS)) + # print utils.bigjson(dict(events=EVENTS)) return result def test_one(self): @@ -166,5 +166,6 @@ class TestPlaybook(unittest.TestCase): # make sure the template module took options from the vars section data = file('/tmp/ansible_test_data_template.out').read() + print data assert data.find("ears") != -1, "template success"