Ansible troubleshooting - Error run-once
By Luca Berton · Published 2024-01-01 · Category: troubleshooting
Learn how to effectively use the run_once directive in Ansible playbooks, ensuring tasks run only once per playbook, and avoid common pitfalls when combined.

Understanding the Ansible Playbook Error: run-once
When developing Ansible playbooks, it's crucial to ensure efficient execution and adhere to best practices. This includes using strategies that align with the desired behavior of your tasks and plays. In the world of Ansible, the run_once directive is a powerful tool. It is used to ensure that a particular task runs only once in a playbook. However, its use can become problematic if not handled correctly, especially when used in conjunction with the strategy: free configuration.
See also: Ansible troubleshooting - Error meta-runtime
What is run_once?
In Ansible, the run_once directive allows you to specify that a task should execute only once, regardless of how many hosts are involved in the playbook. This is particularly useful when you have a task that should be performed only on the control node or a single target host, even in a scenario where multiple hosts are being managed.
Here's a quick example:
- name: Ensure setup is done once
hosts: all
gather_facts: no
tasks:
- name: Perform setup
ansible.builtin.debug:
msg: "This setup should run once"
run_once: true
In this example, the debug task will execute only once, even if it's part of a playbook applied to multiple hosts.
Ansible Lint Output
WARNING Listing 2 violation(s) that are fatal
yaml[truthy]: Truthy value should be one of [false, true]
run_once.yml:4
run-once[task]: Using run_once may behave differently if strategy is set to free.
run_once.yml:6 Task/Handler: Perform setup
Read documentation for instructions on how to ignore specific rule violations.
Rule Violation Summary
count tag profile rule associated tags
1 yaml[truthy] basic formatting, yaml
1 run-once[task] idiom
Failed: 2 failure(s), 0 warning(s) on 1 files. Last profile that met the validation criteria was 'min'.
The Issue with run_once and strategy: free
One common pitfall occurs when you use the run_once directive in combination with the strategy: free setting. The strategy: free tells Ansible to parallelize tasks as much as possible, which can lead to unexpected results when used with run_once. This combination may not guarantee that the task runs only once due to the parallel nature of strategy: free.
To prevent this misalignment of strategies, Ansible Lint has a rule called run-once. This rule checks if the run_once directive is used when the playbook's strategy is set to free. If it encounters this scenario, it issues a warning to prompt the user to reconsider their strategy choices.
See also: Automate Text Capitalization with Ansible Playbooks
Proper Usage and Resolutions
To ensure that your playbook works as expected, consider the following best practices:
Avoid strategy: free with run_once: If your playbook includes tasks with the run_once directive, it's a good practice to avoid using strategy: free for that specific playbook. A playbook-level strategy: free can be overridden by the command line, which may lead to unexpected results.
Example:
- name: "Example of using run_once with a strategy other than free"
hosts: all
strategy: linear
gather_facts: false
tasks:
- name: Task with run_once
ansible.builtin.debug:
msg: "Test"
run_once: true
Disable the Rule: If you have a specific reason to use run_once with strategy: free, you can disable the run-once rule for the task where you intentionally need this combination by adding # noqa: run-once[task] as a comment in your playbook.
Example:
- name: "Example with run_once"
hosts: all
strategy: free
gather_facts: false
tasks:
- name: Task with run_once
ansible.builtin.debug:
msg: "Test"
run_once: true # noqa: run-once[task]
By following these best practices and understanding how run_once and strategy: free interact, you can create more predictable and efficient Ansible playbooks. This ensures that your automation tasks run as intended, regardless of the complexity of your infrastructure.
Note: Always consider the specific requirements of your infrastructure and choose the strategy that aligns with your desired behavior.
Remember, in the world of Ansible, clarity and predictability are keys to success in managing and automating your IT environment.
Conclusion
In conclusion, when working with Ansible playbooks, it's essential to ensure that the chosen strategies align with the intended behavior of tasks and plays. The use of the run_once directive, a powerful tool to execute a task only once, must be carefully handled, especially when combined with the strategy: free configuration. The run-once rule in Ansible Lint serves as a valuable reminder and best practice guideline, helping users avoid potential issues with the use of run_once under the strategy: free scenario.
Proper playbook design and strategy selection are crucial for achieving predictable and efficient automation tasks. While run_once offers fine-grained control over task execution, a mismatch with strategy: free can lead to unintended results due to parallelization. By following the best practices outlined in this article, you can create reliable and maintainable Ansible playbooks.
Always prioritize the clarity and predictability of your automation tasks to effectively manage and automate your IT environment. Carefully consider the specific requirements of your infrastructure and choose the strategy that best fits your needs. In doing so, you can maximize the effectiveness of your Ansible playbooks while minimizing potential issues and unexpected behavior.
See also: Ansible no_log: Hide Sensitive Data in Playbook Output (Guide)
Related Articles
• Ansible Become Guide • Ansible Handlers GuideCategory: troubleshooting