Ansible uses Jinja2 templating to modify files before they are distributed to managed hosts. Jinja2 is one of the most used templating engines for Python.
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 in the ~/ansible-files/
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: yes
tasks:
- template:
src: motd-facts.j2
dest: /etc/motd
owner: root
group: root
mode: 0644
You have done this a couple of times by now:
Understand what the Playbook does.
Execute the Playbook motd-facts.yml
.
Login to node1
via SSH and check the message of the day content.
Log out of node1
.
You should see how Ansible replaces the variables with the facts it discovered from the system.
Add a line to the template to list the current kernel of the managed node.
Do a grep -i
for kernel
Change the template to use the fact you found.
Run the Playbook again.
Check motd by logging in to node1
[student@ansible-1 ansible-files]$ ansible node1 -m setup|grep -i kernel
"ansible_kernel": "3.10.0-693.el7.x86_64",
motd-facts.j2
:Welcome to {{ ansible_hostname }}.
{{ ansible_distribution }} {{ ansible_distribution_version}}
deployed on {{ ansible_architecture }} architecture
running kernel {{ ansible_kernel }}.
node1
.