Saturday, 6 December 2025

Ansible 16. template example

 Lets see a demonstration for template.


Step 1: Create a template file

[oracle@oel01db ansible-project]$ ls -lrt

total 4

drwxr-xr-x 2 oracle oinstall   19 Dec  5 20:31 inventory

drwxr-xr-x 2 oracle oinstall 4096 Dec  6 00:29 playbooks

[oracle@oel01db ansible-project]$ cat ./inventory/hosts

[db_servers]

192.168.0.156

[oracle@oel01db ansible-project]$ mkdir template

[oracle@oel01db ansible-project]$ cd template/

[oracle@oel01db template]$ vi init.ora.j2

[oracle@oel01db template]$ cat init.ora.j2

# Oracle Initialization Parameter File

 db_name={{ item.name }}

 memory_target={{ item.memory_target }}

 processes={{ item.processes }}

 audit_file_dest={{ item.audit_file_dest }}

[oracle@oel01db template]$


Step 2: Create a playbook

[oracle@oel01db ansible-project]$ vi ./playbooks/create_oracle_init.yml

[[oracle@oel01db ansible-project]$ cat ./playbooks/create_oracle_init.yml

---

- name: Deploy Oracle init.ora files

  hosts: db_servers

  become: yes


  vars:

    databases:

      - name: PRODDB

        memory_target: 2G

        processes: 300

        audit_file_dest: /u01/app/oracle/admin/PRODDB/adump


      - name: TESTDB

        memory_target: 1G

        processes: 150

        audit_file_dest: /u01/app/oracle/admin/TESTDB/adump


  tasks:


    - name: Create admin directories for each database

      ansible.builtin.file:

        path: "/u01/app/oracle/admin/{{ item.name }}"

        state: directory

        owner: oracle

        group: oinstall

        mode: 0755

      loop: "{{ databases }}"


    - name: Generate init.ora from template

      ansible.builtin.template:

        src: ../template/init.ora.j2

        dest: "/u01/app/oracle/admin/{{ item.name }}/init.ora"

        owner: oracle

        group: oinstall

        mode: 0644

      loop: "{{ databases }}"

      loop_control:

        label: "{{ item.name }}"


[oracle@oel01db ansible-project]$


Ansible's template module, by default, expects to find your template file (e.g., init.ora.j2) in one of two locations relative to the playbook file you are executing:

  1. Inside a dedicated templates subdirectory: ansible-project/playbooks/templates/init.ora.j2

  2. In the same directory as the playbook: ansible-project/playbooks/init.ora.j2

Note: The key point is that the template's location is resolved relative to the playbook file, not the root of the Ansible project.

[oracle@oel01db ansible-project]$ ansible-playbook -i ./inventory/hosts ./playbooks/create_oracle_init.yml


PLAY [Deploy Oracle init.ora files] *********************************************************************************************************************************************************************************************************


TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************

ok: [192.168.0.156]


TASK [Create admin directories for each database] *******************************************************************************************************************************************************************************************

changed: [192.168.0.156] => (item={u'processes': 300, u'memory_target': u'2G', u'audit_file_dest': u'/u01/app/oracle/admin/PRODDB/adump', u'name': u'PRODDB'})

changed: [192.168.0.156] => (item={u'processes': 150, u'memory_target': u'1G', u'audit_file_dest': u'/u01/app/oracle/admin/TESTDB/adump', u'name': u'TESTDB'})


TASK [Generate init.ora from template] ******************************************************************************************************************************************************************************************************

changed: [192.168.0.156] => (item=PRODDB)

changed: [192.168.0.156] => (item=TESTDB)


PLAY RECAP **********************************************************************************************************************************************************************************************************************************

192.168.0.156              : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[oracle@oel01db ansible-project]$

Verification

[oracle@oel01db ansible-project]$ ansible db_servers -i inventory/hosts -m command -a "cat /u01/app/oracle/admin/PRODDB/init.ora"
192.168.0.156 | CHANGED | rc=0 >>
# Oracle Initialization Parameter File
 db_name=PRODDB
 memory_target=2G
 processes=300
 audit_file_dest=/u01/app/oracle/admin/PRODDB/adump
[oracle@oel01db ansible-project]$
[oracle@oel01db ansible-project]$ ansible db_servers -i inventory/hosts -m command -a "cat /u01/app/oracle/admin/TESTDB/init.ora"
192.168.0.156 | CHANGED | rc=0 >>
# Oracle Initialization Parameter File
 db_name=TESTDB
 memory_target=1G
 processes=150
 audit_file_dest=/u01/app/oracle/admin/TESTDB/adump
[oracle@oel01db ansible-project]$


No comments:

Post a Comment

Building a Safer PostgreSQL CI/CD Pipeline with GitHub Actions: Dev → PR Review → Test Promotion

In my previous post, we explored a simple push-to-main deployment strategy . While functional, that model is not considered an industry best...