What Are Ansible Variables?
In Ansible, variables are like containers for information. They store values that can be used in your automation tasks, such as configuration settings, file paths, or data specific to the hosts you are managing. Variables help make your playbooks and roles dynamic and adaptable.
Table of Contents
Why Use Variables?
- Reusability: Variables make your playbooks and roles reusable. Instead of hardcoding values, you can use variables to parameterize your tasks, making them suitable for different situations.
- Dynamic Configurations: Variables allow you to create dynamic configurations. For example, you can use a variable to set a different port for a service on each host.
- Easy Maintenance: With variables, it’s easier to update or change values in one place. If a configuration setting needs to be adjusted, you can do so by modifying the variable instead of changing multiple tasks.
Types of Ansible Variables
In Ansible, there are several types of variables that you can use to customize your playbooks and roles. These variables are essential for creating dynamic and reusable automation tasks. Here are some of the different types of Ansible variables:
Inventory Variables
These variables are defined in the inventory files (e.g., hosts) and are associated with specific hosts or groups of hosts. They can be used to set host-specific configurations.
[webserver]
192.168.1.20 ansible_user=ansible port=80 admin_user=root
Here is the example playbook that uses Inventory Variables.
---
- hosts: webserver
tasks:
- name: Show inventory variable values
debug:
msg: |
" inventory source: {{ ansible_inventory_sources }}"
"ansible user is: {{ ansible_user }}"
"ansible default HTML directory: {{ default_html_dir }}"
Playbook Variables
Playbook variables are defined in the playbook itself using the vars section. They are used to set variables specific to a particular playbook. Playbook variables have the highest precedence within a playbook.
---
- hosts: webserver
vars:
http_port: 80
tasks:
- name: Ensure Apache is installed
package:
name: httpd
state: present
Here is an example of Playbook Variables.
---
- hosts: webserver
vars:
software:
- git
- telnet
- httpd
- ntpd
tasks:
- name: Show inventory variable values
debug:
msg: |
"inventory source: {{ ansible_inventory_sources }}"
"ansible user is: {{ ansible_user }}"
"ansible default HTML directory: {{ default_html_dir }}"
"software to be installed is: {{ software }}"
Role Variables
Role variables are defined within roles and can be set in role-specific variable files. These variables are typically used to make roles configurable and reusable across different playbooks.
Fact Variables
Fact variables are automatically gathered by Ansible when it connects to a host using the setup module. These variables contain information about the target host, such as hardware details, network configuration, and more.
---
- name: Print facts
hosts: webserver
tasks:
- name: Display facts
debug:
var: ansible_facts
Environment Variables
Ansible can access environment variables that are set on the control machine. These can be useful for providing sensitive information or configuration details that should not be hard-coded in playbooks.
---
- name: Example Playbook with Environment Variables
hosts: webserver
tasks:
- name: Show the value of an environment variable using lookup
debug:
msg: "The value of MY_ENV_VAR is {{ lookup('env', 'HTML_PATH') }}"
Here is an Ansible Playbook with Environment Variables example.
- name: Example Playbook with Environment Variables
hosts: webserver
tasks:
- name: Show the value of an environment variable using lookup
debug:
msg: "'The value of MY_ENV_VAR is {{ lookup('env', 'HTML_PATH') }}'"
Registered Variables
These variables are registered using the register keyword in a task. They store the output of a task and can be used in subsequent tasks. For example, you might register the output of a shell command and then process that output in another task.
---
- name: Get server uptime
shell: uptime
register: uptime_result
- name: Display uptime
debug:
var: uptime_result.stdout
Group Variables
Group variables are defined in the inventory files and apply to all hosts in a particular group. They can be used to set common configurations for multiple hosts.
---
- hosts: webserver
tasks:
- name: Show inventory variable values
debug:
msg: |
" inventory source: {{ ansible_inventory_sources }}"
"ansible user is: {{ ansible_user }}"
"ansible default HTML directory: {{ default_html_dir }}"
"default port is: {{ default_port }}"
Ansible Group Variables Example Playbook
---
- hosts: webserver
tasks:
- name: Show inventory variable values
debug:
msg: |
" inventory source: {{ ansible_inventory_sources }}"
"ansible user is: {{ ansible_user }}"
"ansible default HTML directory: {{ default_html_dir }}"
"default port is: {{ default_port }}"
Default Variables
Default variables are defined within roles and are used as default values when a variable is not explicitly set. These defaults can be overridden in playbooks or inventory.
Extra Variables
Extra variables are defined using the -e option when running an Ansible playbook. They provide a way to pass additional variables to the playbook at runtime.
ansible-playbook -i hosts 01-inventory-variables.yml -e "default_html_dir=/tmp"
These are the various types of variables in Ansible, and understanding how to use them effectively is crucial for creating flexible and dynamic automation solutions.
Special Ansible Variables
Magic Variables
These variables cannot be set directly by the user; Ansible will always override them to reflect the internal state.
Here is the Magic Variable Example Playbook for Ansible
---
- hosts: webserver
tasks:
- name: Show inventory variable values
debug:
msg: |
" inventory source: {{ ansible_inventory_sources }}"
"ansible playname is: {{ ansible_play_name }}"
"ansible play hosts are: {{ ansible_play_hosts }}"
"playbook directory is: {{ playbook_dir }}"