When debugging Ansible playbooks, we often need to test just a portion of the workflow. While --start-at-task
is well-known for beginning execution at a specific point, there's no built-in equivalent for stopping at a particular task.
Here are several effective approaches to control playbook execution flow:
1. Using the meta Module
The cleanest one-line solution:
- name: Debug task
debug:
msg: "Checking variables"
- name: Exit playbook here
meta: end_play
2. Conditional Execution with Tags
Combine tags with the --tags
flag:
- name: Task to run
debug:
msg: "Important check"
tags: debug
- name: Later task
command: /bin/foo
when: not debug_mode|default(False)
Run with ansible-playbook playbook.yml --tags debug
3. Fail Task with Custom Message
Force termination with a clear error:
- name: Debug stop point
fail:
msg: "Debug exit point - intentional failure"
when: debug_early_exit|default(False)
4. Variable-Driven Execution Flow
Control execution through variables:
- name: Set stop point
set_fact:
stop_after_this: true
- name: Subsequent task
command: /bin/bar
when: not stop_after_this|default(False)
For frequent debugging, consider creating a debug utilities role:
# tasks/debug.yml
- name: Stop execution
meta: end_play
when: debug_stop_after_this|default(False)
Then include it in your playbook:
- include_role:
name: debug_utils
tasks_from: debug
vars:
debug_stop_after_this: true
Method | Pros | Cons |
---|---|---|
meta: end_play | Clean exit, no failure | Requires Ansible 2.2+ |
Tags | Flexible execution control | Manual tag management |
fail task | Explicit debugging intent | Shows as error in output |
Variables | Dynamic control | More verbose playbook |
For CI/CD pipelines, combine these methods with environment variables:
- name: Debug exit point
meta: end_play
when: lookup('env', 'ANSIBLE_DEBUG_EXIT') == 'true'
Run with ANSIBLE_DEBUG_EXIT=true ansible-playbook playbook.yml
When debugging complex Ansible playbooks, you often need to examine execution up to a specific task without running through the entire playbook. While --start-at-task
helps begin execution from a particular point, there's no built-in equivalent for stopping at a target task.
The cleanest solution is using Ansible's meta
module with end_play
:
- name: Task where you want to stop execution
debug:
msg: "Reached debugging checkpoint"
- name: End playbook execution here
meta: end_play
For more control, combine fail
with conditionals:
- name: Debugging stop point
fail:
msg: "Stopping execution for debugging"
when: debug_mode|bool
Pair the meta approach with tags for flexible debugging:
ansible-playbook site.yml --tags "up_to_debug_point" --skip-tags "after_debug_point"
Here's a complete debugging pattern I use in production:
- hosts: all
vars:
debug_stop_point: "task3" # Set this variable
tasks:
- name: task1
debug:
msg: "Executing task1"
- name: Check debug stop (task1)
meta: end_play
when: debug_stop_point == "task1"
- name: task2
debug:
msg: "Executing task2"
- name: Check debug stop (task2)
meta: end_play
when: debug_stop_point == "task2"
Combine this with variable inspection for comprehensive debugging:
- name: Inspect all variables
debug:
var: vars
when: debug_mode|bool
- meta: end_play
when: debug_mode|bool