Ansible Template and Handlers explained with Example

We can declare variables in

  • playbook
  • inventory
  • commands

Which can be used & Intropolate only in playbook Tasks but not in the files used in playbook.

Solution: Template
Using Template module you can Intropolate vars mentioned in the files used in playbook.

Rule for using template Module

  • A file must be .j2 ext
  • Must use a module call “template”

Example Code for Cento/RHEL


---
- name: Update web servers
  hosts: web
  vars:
    myname: "Rajesh Kumar"

  tasks:
  - name: Install Apache in centos7
    ansible.builtin.yum:
      name: httpd
      state: latest
  - name: Copy index.html
    ansible.builtin.copy:
      src: index.html
      dest: /var/www/html/index.html
  - name: Template index.html
    template:
      src: index.html.j2
      dest: /var/www/html/index-template.html
  - name: Starting a Apache Server
    ansible.builtin.service:
      name: httpd
      state: started

index.html.j2

Project Requirement

  • When you Change APACHE STATIC HTML Content -> HTTPD restart is not required
  • When you Change APACHE Conf -> HTTPD restart is not required
  • HTTP should be run 90
  • No restart should be done on STATIC
  • Restart must be done at conf changes

---
- name: Update web servers
  hosts: web
  vars:
    myname: "Rajesh Kumar"
    httpport: 8090

  tasks:
  - name: Install Apache in centos7
    ansible.builtin.yum:
      name: httpd
      state: latest
  - name: Copy index.html
    ansible.builtin.copy:
      src: index.html
      dest: /var/www/html/index.html
  - name: Starting a Apache Server
    ansible.builtin.service:
      name: httpd
      state: started
  - name: stopped a Apache Server
    ansible.builtin.service:
      name: httpd
      state: stopped
  - name: Template for httpd.conf
    template:
      src: httpd.conf.j2
      dest: /etc/httpd/conf/httpd.conf
  - name: Starting a Apache Server
    ansible.builtin.service:
      name: httpd
      state: started

Example code for Template for Ubuntu


---
- name: Update web servers
  hosts: web
  vars:
    myname: "Rajesh Kumar"
    port: 81

  tasks:
  - name: Install Apache in Ubuntu
    ansible.builtin.apt:
      name: apache2
      state: latest
  - name: Copy index.html
    ansible.builtin.copy:
      src: index.html
      dest: /var/www/html/index.html
  - name: stopped a Apache Server
    ansible.builtin.service:
      name: apache2
      state: stopped
  - name: Template for httpd.conf
    template:
      src: ports.conf.j2
      dest: /etc/apache2/ports.conf
  - name: Starting a Apache Server
    ansible.builtin.service:
      name: apache2
      state: started

Problems

  • No change in config file but STOP and START happening

Solution

  • Handlers

What is Handlers?

  • A section is plyabook similar to tasks section
  • It contains multiple task similar to tasks section
  • The Handler task would execute when you call from tasks’s task
  • BUT one condition – ONLY when calling tasks’s task is CHANGED == TRUE

---
- name: Update web servers
  hosts: web
  vars:
    myname: "Rajesh Kumar"
    httpport: 8090

  tasks:
  - name: Install Apache in centos7
    ansible.builtin.yum:
      name: httpd
      state: latest
  - name: Copy index.html
    ansible.builtin.copy:
      src: index.html
      dest: /var/www/html/index.html
  - name: Starting a Apache Server
    ansible.builtin.service:
      name: httpd
      state: started
  - name: Template for httpd.conf
    template:
      src: httpd.conf.j2
      dest: /etc/httpd/conf/httpd.conf
    notify:
      - ReStarting a Apache Server

  handlers:
  - name: ReStarting a Apache Server
    ansible.builtin.service:
      name: httpd
      state: restarted



Handlers Code Example for Ubuntu


---
- name: Update web servers
  hosts: localhost
  vars:
    myname: "Rajesh Kumar"
    port: 81

  tasks:
  - name: Install Apache in Ubuntu
    ansible.builtin.apt:
      name: apache2
      state: latest
  - name: Copy index.html
    ansible.builtin.copy:
      src: index.html
      dest: /var/www/html/index.html
  - name: Template for httpd.conf
    template:
      src: ports.conf.j2
      dest: /etc/apache2/ports.conf
    notify:
      - ReStarting a Apache Server
  - name: Starting a Apache Server
    ansible.builtin.service:
      name: apache2
      state: started

  handlers:
  - name: ReStarting a Apache Server
    ansible.builtin.service:
      name: apache2
      state: restarted

Rajesh Kumar
Follow me