How to Use Variables in Ansible Playbook (Simple Guide)

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.

[ez-toc]

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.

Ansible-Playbook-Execution-Variable-debug-module

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.

List-Dictionary-Ansible-Variables

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.

02-varaible-list-example-playbook-execution

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 }}."

03-varaible-list-example-playbook-execution

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.

03-varaible-list-example2-playbook-execution

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 }}"

Magic-Variables-Ansible-Playbook

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.

Ansible-Facts-Output

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

Ansible-Facts-With-Filters

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.

Connection-Variables-Ansible-Playbook

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

Leave a Comment

five × 2 =