diff --git a/bin/ansible-playbook b/bin/ansible-playbook index c476470127..98916e254e 100755 --- a/bin/ansible-playbook +++ b/bin/ansible-playbook @@ -72,6 +72,8 @@ def main(args): help="do a playbook syntax check on the playbook, do not execute the playbook") parser.add_option('--list-tasks', dest='listtasks', action='store_true', help="do list all tasks that would be executed") + parser.add_option('--step', dest='step', action='store_true', + help="one-step-at-a-time: confirm each task before running") options, args = parser.parse_args(args) @@ -111,6 +113,8 @@ def main(args): stats = callbacks.AggregateStats() playbook_cb = callbacks.PlaybookCallbacks(verbose=utils.VERBOSITY) + if options.step: + playbook_cb.step = options.step runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY) pb = ansible.playbook.PlayBook( diff --git a/lib/ansible/callbacks.py b/lib/ansible/callbacks.py index 406a87f37f..90af6ab555 100644 --- a/lib/ansible/callbacks.py +++ b/lib/ansible/callbacks.py @@ -464,7 +464,20 @@ class PlaybookCallbacks(object): msg = "TASK: [%s]" % name if is_conditional: msg = "NOTIFIED: [%s]" % name - print banner(msg) + + if hasattr(self, 'step') and self.step: + resp = raw_input('Perform task: %s (y/n/c): ' % name) + if resp.lower() in ['y','yes']: + self.skip_task = False + print banner(msg) + elif resp.lower() in ['c', 'continue']: + self.skip_task = False + self.step = False + print banner(msg) + else: + self.skip_task = True + + call_callback_module('playbook_on_task_start', name, is_conditional) def on_vars_prompt(self, varname, private=True, prompt=None, encrypt=None, confirm=False, salt_size=None, salt=None, default=None): diff --git a/lib/ansible/playbook/__init__.py b/lib/ansible/playbook/__init__.py index b28ca698f3..91e1aa39bc 100644 --- a/lib/ansible/playbook/__init__.py +++ b/lib/ansible/playbook/__init__.py @@ -301,7 +301,9 @@ class PlayBook(object): ''' run a single task in the playbook and recursively run any subtasks. ''' self.callbacks.on_task_start(utils.template(play.basedir, task.name, task.module_vars, lookup_fatal=False), is_handler) - + if hasattr(self.callbacks, 'skip_task') and self.callbacks.skip_task: + return True + # load up an appropriate ansible runner to run the task in parallel results = self._run_task_internal(task)