Ansible 'Not a Valid Attribute for a Play' Error: How to Fix (Guide)
By Luca Berton · Published 2024-01-01 · Category: troubleshooting
Fix the Ansible error 'is not a valid attribute for a Play'. Common causes: typos in play keywords, wrong indentation level, unsupported directives. Complete troubleshooting guide.
Introduction
In today's episode of Ansible Pilot, I'm Luca Berton, and we'll be diving into Ansible troubleshooting, focusing on the infamous "not a valid attribute for a Play" error. This error can be a stumbling block for many, but fear not – I'll guide you through reproducing, troubleshooting, and fixing this issue.
Unveiling the Error in a Live Demo
The most effective way to explore Ansible troubleshooting is through a live Playbooknstration. Let's reproduce the "not a valid attribute for a Play" error and walk through the steps to resolve it.
Error Code: invalid_play_attribute_error.yml
Error Execution
Executing the playbook with the error:
Fixing the Code: invalid_play_attribute_fix.yml
Executing the Fixed Code
Executing the fixed playbook:
You can find the code on GitHub.
Conclusion
In summary, you've now gained valuable insights into troubleshooting the "not a valid attribute for a Play" error in Ansible. Understanding the error message, reproducing the issue, and implementing the necessary fixes are essential skills for every Ansible practitioner.
If you found this troubleshooting guide helpful, be sure to subscribe for more Ansible insights.
Why This Error Happens
Ansible plays only accept specific top-level keywords. If you use a keyword that isn't recognized, you get this error:
Common Causes and Fixes
Cause 1: Typo in play keyword
Cause 2: Module at play level instead of task level
Cause 3: Wrong indentation pushes task into play level
Cause 4: Using Ansible 2.x keywords in older version
Some keywords were added in newer versions. Check your Ansible version:
Valid Play Keywords Reference
| Keyword | Description | |---------|-------------| | name | Play name | | hosts | Target hosts | | tasks | List of tasks | | pre_tasks | Tasks before roles | | post_tasks | Tasks after roles | | roles | List of roles | | handlers | Handler definitions | | vars | Variable definitions | | vars_files | External variable files | | vars_prompt | Interactive prompts | | become | Enable privilege escalation | | become_method | sudo, su, etc. | | become_user | Target user | | gather_facts | Collect host facts | | serial | Batch size for rolling updates | | max_fail_percentage | Failure threshold | | any_errors_fatal | Stop on first error | | environment | Environment variables | | collections | Collection search paths | | module_defaults | Default module parameters | | tags | Play tags | | when | Play-level conditional | | connection | Connection type | | timeout | Connection timeout | | strategy | Execution strategy | | order | Host execution order | | ignore_errors | Continue on failure | | ignore_unreachable | Skip unreachable hosts | | no_log | Suppress output |
FAQ
How do I know which keywords my version supports?
Can I use custom keywords?
No — Ansible has a fixed set of play keywords. Custom data should go in vars:.
Why does role give this error but roles works?
roles (plural) is the valid keyword. role (singular) is used inside roles: list with the role: key format:
Related Articles • Ansible Inventory Guide • ansible.builtin.file Guide • Ansible Roles Guide
Category: troubleshooting
Watch the video: Ansible 'Not a Valid Attribute for a Play' Error: How to Fix (Guide) — Video Tutorial