Variables Usage
Last updated: June 29, 2025
My Variable Journey with Ansible
When I first started automating with Ansible, I used to hardcode values directly in my playbooks - server names, file paths, configuration options - everything was fixed. This approach quickly became unwieldy as I started managing more complex environments. The real "aha" moment came when I fully embraced variables in Ansible, which transformed my playbooks from rigid, single-purpose scripts into flexible, reusable automation tools.
In this blog post, I'll share my experience with Ansible variables - what they are, how to use them effectively, and how they've helped me automate both Linux and Windows environments more efficiently. Whether you're managing a handful of systems or a complex multi-environment infrastructure, mastering variables is essential to your Ansible journey.
Understanding Variables in Ansible
Variables in Ansible are containers that store values which can differ between hosts, environments, or runs. They allow you to create playbooks that can adapt to different scenarios without requiring code changes. Think of them as the "dynamic" parts of your otherwise static playbooks.
Valid Variable Names
Before diving into variable usage, it's important to understand the naming rules:
Variables can contain letters, numbers, and underscores
They must start with a letter or underscore (never a number)
Never use spaces or dashes in variable names
Avoid using Python or Ansible reserved keywords
Good variable names:
server_name
http_port
web_user
_internal_variable
max_connectionsInvalid variable names:
Where to Define Variables
One of the most powerful aspects of Ansible is the flexibility in where and how you can define variables. Over the years, I've learned that choosing the right location depends on your specific use case.
In Playbooks
The simplest approach is defining variables directly in playbooks:
This works well for small playbooks, but as your automation grows, you'll want more organization.
In Variable Files
For better organization, I prefer keeping variables in separate files:
With the contents of vars/apache_config.yml:
This approach makes your playbooks cleaner and allows for easier reuse of common variable sets.
In Inventory
I often use inventory variables for host-specific or group-specific settings. This works well for values that are tied to specific hosts or environments:
Using host_vars and group_vars Directories
For larger environments, I organize variables into host_vars and group_vars directories. This approach has saved me countless hours of maintenance:
Contents of group_vars/webservers.yml:
Contents of host_vars/web1.example.com.yml:
Variable Types in Ansible
Ansible supports various variable types to represent different kinds of data. Understanding them has helped me build more effective playbooks.
Simple Variables
These are basic key-value pairs:
List Variables
For storing multiple values in an ordered sequence:
To reference items in a list:
Dictionary Variables
For storing structured data with keys and values:
To reference values in a dictionary:
Using Variables in Playbooks
Once defined, variables can be used throughout your playbooks, templates, and conditionals. The proper syntax for referencing variables is {{ variable_name }}.
In Tasks
In Conditionals
In Loops
Windows Example: Managing IIS with Variables
For Windows environments, variables work the same way but are used with Windows-specific modules. Here's how I manage IIS configurations using variables:
Registering Variables
One of the most powerful features I've found is the ability to capture output from tasks using the register keyword:
For Windows, a similar approach works:
Variable Precedence
Understanding variable precedence has saved me from many debugging sessions. Ansible loads all possible variables but applies them in a specific order. Here's a simplified version from lowest to highest precedence:
Role defaults (lowest)
Inventory variables
Group variables from inventory
Host variables from inventory
Group vars files (group_vars/*)
Host vars files (host_vars/*)
Play variables (vars: in playbook)
Task variables
Include variables
Extra variables (highest, command line -e)
Sequence Diagram: Variable Processing Flow
Here's a visual representation of how Ansible processes variables:
Managing Secret Variables with Ansible Vault
For sensitive information like passwords and API keys, I always use Ansible Vault. This allows me to encrypt variables while still using them in playbooks:
Inside vars/secure_vars.yml (before encryption):
Environment-Specific Variables
To manage multiple environments (dev, staging, production), I use a combination of group variables and variable files:
I would then run this with:
Variable Tips for Complex Environments
After years of working with Ansible, here are some practical variable tips I've learned:
1. Use Default Values
Provide defaults to prevent undefined variable errors:
2. Combine Variables
For complex data structures, you can combine variables:
3. Namespace Your Variables
For larger projects, use namespacing to avoid collisions:
4. Debug Variables When Needed
5. Use Variable Files for Different OS Types
With separate files like Debian.yml and Windows.yml containing OS-specific variables.
Windows-Specific Variable Notes
When working with Windows hosts, I've found these variable practices helpful:
Path Formatting: Use forward slashes or escaped backslashes
Registry Values: Store registry paths in variables
Windows Features: Maintain lists of required features
Conclusion
Variables are what transform Ansible from a simple command runner into a powerful automation platform. As my infrastructure has grown more complex, I've come to rely heavily on the variable system to make my playbooks adaptable and reusable across environments.
The key lessons I've learned about Ansible variables are:
Organize thoughtfully: Choose the right location for variables based on their purpose and scope
Use the right data structures: Lists, dictionaries, and simple variables all have their place
Understand precedence: Know which variables will override others
Protect secrets: Use Ansible Vault for sensitive data
Provide defaults: Make playbooks more robust by handling missing variables gracefully
Whether you're managing Linux web servers, Windows application servers, or a complex hybrid environment, mastering variables will dramatically increase your productivity with Ansible. It's been one of the most valuable skills in my automation toolkit.
Last updated