In this blog post, we will show you how to use variables in Ansible playbook.
If you have done programming or written code before, then the concept of variables should ring a bell. Just like in any programming language, in Ansible a variable is a placeholder that holds a value that can, thereafter, be referenced in a playbook YAML file or on the command line.
Rules that govern the naming of variables
In Ansible, the following rules apply when naming variables:
- A variable name should begin with either a lowercase or uppercase character. It cannot start with an underscore, space, digit, or special character.
- A variable name should only contain alphanumeric characters, underscores, and integers.
- Some reserved keywords cannot be assigned to a variable. These include Python keywords and Ansible playbook parameters.
There are different ways of using Ansible variables in Playbooks. Let’s dive in.
Use Variables in a Ansible playbook
At the most basic level, you can define a variable name using a single value inside a playbook using the “vars” parameter. Here’s a simple playbook example.—
- hosts: server1 vars: salute: Hey guys! tasks: - name: Ansible Simple Variable Example Usage debug: msg: "{{ salute }}. Welcome to Linuxtechi."
In this YAML file, the ‘vars’ block starts off the variable definition. The variable ‘salute’ stores the string value ‘Hey guys’. The variable is then called and accessed using the ‘msg’ module on the last line.
During playbook runtime, the variable ‘salute’ is called and the value is printed to stdout.
List and Dictionary Variables
Variables can also take advanced forms such as lists and dictionaries. You can create a variable with multiple values using the following list syntax.
vars: variable_name: - item - item - item
For example, here’s a playbook containing a list of three students:
--- - hosts: server1 vars: students: - Alice - Mike - Sophie tasks: - name: Ansible lists Variable Example Usage debug: msg: " Our students are {{ students }}."
When the playbook is executed, all the student names which, essentially list items, are printed out to the terminal.
In addition, you can reference a specific list item using square brackets. For example, {{ students[1] }} references the second list item. In the following example, the student ‘Mike ’is printed out.
Variable items can also be referenced as dictionaries using key-value pairs as shown.
vars: variable_name: - key1: value 1 - key2: value2
In the following playbook example, the student dictionary is formatted in key-value pairs.
--- - hosts: server1 vars: students: - student_1: Alice - student_2: Mike - student_3: Sophie tasks: - name: Ansible dictionary Variable Example Usage debug: msg: " Our students are {{ students }}."
Just like lists, you can reference specific items inside a dictionary using square brackets. For example, {{ students[1] }} references the second key-value pair item in the dictionary.
Special Variables
In Ansible, special variables are reserved variables that contain information about the inventory, system, or information about the playbook. These are predefined variables and cannot be explicitly set or defined by a user.
Special variables include magic variables, ansible facts, and connection variables.
Magic Variables
Magic variables cannot the set or defined by a user and always represent the internal state of the host system or Ansible. The playbook below prints out the Ansible version defined by the variable name {{ ansible_version }} and the hostname of the system as defined in the Ansible inventory using {{ ansible_version }}.
--- - hosts: Server1 tasks: - name: Ansible Magic variable example debug: msg: - "You are running Ansible version {{ ansible_version }} " - "This is running on {{ inventory_hostname }}"
Ansible Facts
Ansible facts are special variables that provide information about the system and hardware information of the host during playbook execution. The data obtained is mostly used for making decisions when you want to execute a specific host task. Such information includes the IP address, operating system, system architecture, etc.
To collect facts about a specific host, you can run the following command:
$ ansible -m setup <hostname>
The command prints out the facts in JSON format.
You can filter specific facts using the following syntax:
$ ansible -m setup <hostname> -a "filter=<fact_name>"
In the following Ansible command, we are displaying OS information about the remote host using the ansible_lsb fact
Connection Variables
Connection variables spell out how the Ansible control node connects to remote hosts during playbook execution. They provide flexibility in handling various types of connections.
Consider the playbook file below.
--- - hosts: server1 remote_user: root become: true become_method: sudo tasks: - name: Install Apache webserver apt: name: apache2 state: latest
The become and become_method connection variables turn on privilege escalation and allow you to run the playbook as a root user on the remote host. During playbook runtime, the –ask-become-pass parameter prompts for the root user’s password.
That’s all from this post, I believe you have found it informative and useful. Feel free to post your queries and feedback in below comments section.
Also Read: How to Execute Ansible Ad-Hoc Commands