Ansible is a powerful automation tool, but dealing with errors efficiently is crucial for maintaining smooth deployments and configurations. Whether you want to ignore certain errors, define custom failure conditions, or control how unreachable hosts are handled, Ansible provides multiple mechanisms to fine-tune error handling.
In this guide, we’ll explore different ways to handle errors in Ansible, including ignore_errors
, failed_when
, ignore_unreachable
, any_errors_fatal
, and command-line options.
1. Ignoring Errors in a Task with ignore_errors
The simplest way to ignore errors in Ansible is by using ignore_errors: yes
. When this directive is added to a task, Ansible will continue executing subsequent tasks even if the current task fails.
Example: Ignoring Errors in a Task
- name: Example playbook using ignore_errors
hosts: all
tasks:
- name: Run a command that might fail but ignore errors
command: /bin/false
ignore_errors: yes
- name: Next task that will run regardless of the previous error
debug:
msg: "This task runs even though the previous one failed."
Key Takeaway: The failed task will still be marked as failed in the output, but it won’t interrupt the playbook execution.
2. Customizing Failure Conditions with failed_when
By default, Ansible considers a nonzero exit status as a failure. However, you can define custom conditions for marking a task as failed using failed_when
.
Example 1: Preventing a Task from Failing
- name: Run a command but never mark it as failed
command: /bin/false
register: result
failed_when: false
This ensures that the task is always marked as successful, even if the command fails.
Example 2: Failing Only on Specific Conditions
- name: Run a command and fail only on specific error text
command: some_command
register: result
failed_when: "'CRITICAL ERROR' in result.stderr"
This marks the task as failed only if the output contains “CRITICAL ERROR”, giving you more granular control.
3. Ignoring Unreachable Hosts with ignore_unreachable
By default, Ansible stops execution if a host is unreachable. If you want to continue execution despite unreachable hosts, use ignore_unreachable
.
Example:
- name: Ping hosts, ignoring unreachable errors
hosts: all
tasks:
- name: Ping the hosts
ping:
ignore_unreachable: yes
Key Takeaway: This is useful when working with unreliable networks or dynamic inventories where some hosts may not always be accessible.
4. Making All Errors Fatal with any_errors_fatal
If you want to stop execution on all hosts when any host encounters an error, use any_errors_fatal
.
Example:
- name: Play where any error is fatal for all hosts
hosts: all
any_errors_fatal: true
tasks:
- name: This command will abort the run on all hosts if it fails
command: /bin/false
Useful in scenarios where consistency across hosts is critical.
5. Controlling Failure Percentage with Command-Line Options
While most error handling is done inside playbooks, you can also adjust failure handling at runtime.
Example: Allowing a Certain Percentage of Failures
ansible-playbook playbook.yml --max-fail-percentage=100
This allows failures on up to 100% of hosts without aborting the playbook.
Ansible Error-Handling Techniques
Feature | Functionality |
---|---|
ignore_errors: yes | Continue playbook execution even if a task fails. |
failed_when: false | Prevent a task from failing, regardless of the output. |
ignore_unreachable: yes | Continue execution even if some hosts are unreachable. |
any_errors_fatal: true | Stop the playbook run on all hosts if any error occurs. |
--max-fail-percentage | Allows failures on a set percentage of hosts before aborting. |
Final Thoughts
Error handling in Ansible is highly flexible, allowing you to control how failures are treated based on your specific use case. Whether you need to ignore minor errors, fail only under certain conditions, or stop execution across all hosts, these techniques will help you build robust playbooks.
By leveraging ignore_errors
, failed_when
, ignore_unreachable
, any_errors_fatal
, and command-line options, you can ensure smooth automation workflows without unexpected disruptions.
Would you like more Ansible tips? Let us know in the comments!