diff --git a/lib/ansible/cli/playbook.py b/lib/ansible/cli/playbook.py index 9e97f53c53..1eab61eb4d 100644 --- a/lib/ansible/cli/playbook.py +++ b/lib/ansible/cli/playbook.py @@ -60,12 +60,12 @@ class PlaybookCLI(CLI): # ansible playbook specific opts parser.add_option('--list-tasks', dest='listtasks', action='store_true', help="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") - parser.add_option('--start-at-task', dest='start_at', - help="start the playbook at the task matching this name") parser.add_option('--list-tags', dest='listtags', action='store_true', help="list all available tags") + parser.add_option('--step', dest='step', action='store_true', + help="one-step-at-a-time: confirm each task before running") + parser.add_option('--start-at-task', dest='start_at_task', + help="start the playbook at the task matching this name") self.options, self.args = parser.parse_args() diff --git a/lib/ansible/executor/connection_info.py b/lib/ansible/executor/connection_info.py index 46ce129e45..a760cc9aab 100644 --- a/lib/ansible/executor/connection_info.py +++ b/lib/ansible/executor/connection_info.py @@ -177,6 +177,8 @@ class ConnectionInformation: self.no_log = False self.check_mode = False self.force_handlers = False + self.start_at_task = None + self.step = False #TODO: just pull options setup to above? # set options before play to allow play to override them @@ -241,6 +243,10 @@ class ConnectionInformation: self.check_mode = boolean(options.check) if hasattr(options, 'force_handlers') and options.force_handlers: self.force_handlers = boolean(options.force_handlers) + if hasattr(options, 'step') and options.step: + self.step = boolean(options.step) + if hasattr(options, 'start_at_task') and options.start_at_task: + self.start_at_task = options.start_at_task # get the tag info from options, converting a comma-separated list # of values into a proper list if need be. We check to see if the diff --git a/lib/ansible/executor/play_iterator.py b/lib/ansible/executor/play_iterator.py index 8794e7e403..2ca3815e41 100644 --- a/lib/ansible/executor/play_iterator.py +++ b/lib/ansible/executor/play_iterator.py @@ -99,6 +99,17 @@ class PlayIterator: self._host_states = {} for host in inventory.get_hosts(self._play.hosts): self._host_states[host.name] = HostState(blocks=self._blocks) + # if we're looking to start at a specific task, iterate through + # the tasks for this host until we find the specified task + if connection_info.start_at_task is not None: + while True: + (s, task) = self.get_next_task_for_host(host, peek=True) + if s.run_state == self.ITERATING_COMPLETE: + break + if task.get_name() != connection_info.start_at_task: + self.get_next_task_for_host(host) + else: + break # Extend the play handlers list to include the handlers defined in roles self._play.handlers.extend(play.compile_roles_handlers())