Workshop Exercise - Templates

Read this in other languages:
uk English, japan日本語, brazil Portugues do Brasil, france Française,Español Español.

Table of Contents


This exercise will cover Jinja2 templating. Ansible uses Jinja2 templating to modify files before they are distributed to managed hosts. Jinja2 is one of the most used template engines for Python (


Step 1 - Using Templates in Playbooks

When a template for a file has been created, it can be deployed to the managed hosts using the template module, which supports the transfer of a local file from the control node to the managed hosts.

As an example of using templates you will change the motd file to contain host-specific data.

First create the directory templates to hold template resources in ~/ansible-files/:

[student@ansible-1 ansible-files]$ mkdir templates

Then in the ~/ansible-files/templates/ directory create the template file motd-facts.j2:

Welcome to {{ ansible_hostname }}.
{{ ansible_distribution }} {{ ansible_distribution_version}}
deployed on {{ ansible_architecture }} architecture.

The template file contains the basic text that will later be copied over. It also contains variables which will be replaced on the target machines individually.

Next we need a playbook to use this template. In the ~/ansible-files/ directory create the Playbook motd-facts.yml:

- name: Fill motd file with host data
  hosts: node1
  become: true
    - template:
        src: motd-facts.j2
        dest: /etc/motd
        owner: root
        group: root
        mode: 0644

You have done this a couple of times by now:

You should see how Ansible replaces the variables with the facts it discovered from the system.

Step 2 - Challenge Lab

Add a line to the template to list the current kernel of the managed node.


filter for kernel

Run the newly created playbook to find the fact name.


Solution below!

- name: Capture Kernel Version
  hosts: node1


    - name: Collect only kernel facts
        - '*kernel'
      register: setup

    - debug:
        var: setup

With the wildcard in place, the output shows:

TASK [debug] *******************************************************************
ok: [node1] => {
    "setup": {
        "ansible_facts": {
            "ansible_kernel": "4.18.0-305.12.1.el8_4.x86_64"
        "changed": false,
        "failed": false

With this we can conclude the variable we are looking for is labeled ansible_kernel.

Then we can update the motd-facts.j2 template to include ansible_kernel as part of its message.

Welcome to {{ ansible_hostname }}.
{{ ansible_distribution }} {{ ansible_distribution_version}}
deployed on {{ ansible_architecture }} architecture
running kernel {{ ansible_kernel }}.
[student@ansible-1 ~]$ ansible-navigator run motd-facts.yml -m stdout
[student@ansible-1 ~]$ ssh node1
Welcome to node1.
RedHat 8.1
deployed on x86_64 architecture
running kernel 4.18.0-305.12.1.el8_4.x86_64.

Previous Exercise - Next Exercise

Click here to return to the Ansible for Red Hat Enterprise Linux Workshop