Ansible 9 Custom Roles - Reusability

Hello Guys, welcome back to DevSecOps Automations!!
In this post, we will be exploring the Custom role create and usage in a playbook, which is a most industry requirement.


It depends on your use cases. It's always recommended to write a role if you have a complex set of tasks consist of handlers and jinja templates. Roles break down a complex playbook into simple and multiple reusable plays easy to read!

In the last post, we have learned about how ansible-galaxy helps us to install, create, modify the ready-made roles which are provided by the Ansible community freely on the Galaxy site.

What are the roles why we should use them in Ansible?

As per my understanding so far following points :
  1. A role can be defined when we have to do one or many tasks
  2. It is a set of tasks with a single objective (for example reboot of box - stop all process, reboot, start process)
  3. You can organize the code in more readable form using roles it is like functions in Python or C 
  4. Here the main objective is that roles can be exchanged within the company playbooks and if it is more genric public can share in community
  5. You can publish your roles to ansible galaxy community (public roles repository)
  6. Ansible roles can be defined with specific structure of directories and files, role name can be directory vars directory contains main.yml file to define the variables that can be reused in the role's play

Steps to define your Ansible Custom Roles  

Step 1: Create the directory structure using the ansible-galaxy command
cd roles
ansible-galaxy init apache --offline
cd apache/tasks

Step 2: to make more managable vim tasks/main.yml
- include: install.yml
- include: configure.yml
- include: service.yml

Let's create these files which are mentioned in the main.yml file, first install.yml file with
---
# install apache server
- name: install apache
  yum:
    name: httpd
    state: latest
Next configure.yml file with :
---
 - name: httpd configure
   copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
   notify:
     - restart apache service

 - name: send index.html
   copy: src=index.html dest=/var/www/html/index.html
   /var/www/html/      

The third file is service.yml with:
---
 - name: start httpd service
   service: name=httpd state=started

Using static files by roles

Step 3: Let's create two static files as index.html file and httpd.conf file
 cp /etc/httpd/conf/httpd.conf .
 vi httpd.conf
 head httpd.conf
#
# ============== This is from ANSIBLE Configuration ======================
# This is the main Apache HTTP server configuration file.  It contains the
The web-page created from index.html file. cat roles/apache/files/index.html

Namaste Ansible configured Apache

Wishing you great learning... HAPPY A N S I B L E automations!!


Event Handlers - notify from roles

Now go to the apache/handlers where the main.yml entry you can use :
---
# Apache handler file
- name: restart apache service
  service: name=httpd state=restarted
Ensure that name of the handler should match to the name in the notify section in the configure.yml otherwise it wont trigger. cat main.yml Now update the meta information about this role
cd /home/vagrant/prod/roles
vim apache/meta/main.yml
Modify the following lines:
  author: Pavan Devarakonda
  description: Sample apache role
  company: Vybhava Technologies
  platforms:
  - name: EL
    versions:
    - all
Now goto the folder roles check with the tree command for 'apache'
tree apache
apache
├── defaults
│   └── main.yml
├── files
│   ├── httpd.conf
│   └── index.html
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   ├── configure.yml
│   ├── install.yml
│   ├── main.yml
│   └── service.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

now back to the root of your project (in my casse path is /home/vagrant/prod) or else /etc/ansible vime apache-site.yml
---
- hosts: web
  gather_facts: false
  roles:
    - apache
    #- ntp you can add more roles
Now all set to go, check the syntax
ansible-playbook apache-site.yml --syntax-check
Run the playbook:
ansible-playbook apache-site.yml -b
Here -b is given to become all the install, configure, service commands need root access, where you can mention this inside playbook 'become: yes'
 
Once the playbook is executed successfully there will be 3 changes. Validate that
 



Comments

Popular posts from this blog

Ansible 11 The uri module with examples

Jenkins Active choices parameter - Dynamic input

DevOps Weapons