Tuesday, August 3, 2021

Ansible 6 Understanding host_vars and group_vars

In this post, we will discuss the possible options for ansible variables precedence, Experiment with few host_vars, group_vars, and their variable precedence. You can specify the variables along with the host inside your inventory itself. 

Ansible host_vars and group_vars and usage options



The command-line variable will be the highest priority.


To test the variable precedence, top priority extra vars
ansible -i "node1," all \
  -e "var1=VybhavaTechnologies" \
  -m debug -a 'msg={{ var1 }}'

Here -i use the target host and the group name to define an extra variable that will have the highest priority. Using debug module we can get the var1 value using jinja format to print.

Ansible extra_vars
ansible extra variables highest precedence 
Let's see the following example:

  Create the inventory.yml file in "dev" directory. inventory.yml
all:
  children:
    common:
      children:
        webserver:
          hosts:
            node[1:2]:
          vars:
            var1: "webserver"
        dbserver:
          hosts:
            localhost:
              var1: "node3"
          vars:
            var1: "VybhavaTechnologies"

    
Host_vars and Group_vars in Ansible
Ansible host_vars and group_vars

Now run the following command to know how the var1 will work at each group level and host level from the inventory variables.
 
ansible -i inventory.yml all -m debug -a 'msg={{ var1 }}'
#Try 2
ansible -i inventory.yml webserver -m debug -a 'msg={{ var1 }}'
ansible -i inventory.yml dbserver -m debug -a 'msg={{ var1 }}'
The output of the above execution is :
Ansible debug command
Ansible variable precedence test using inventory variables

Let's use clean inventory file now, that is remove all the variables values 
inventory.yml
all:
  children:
    common:
      children:
        webserver:
          hosts:
            node[1:2]:
        dbserver:
          hosts:
            localhost:

Now let us use the group_vars and host_vars for the same purpose testing var1 value!
     mkdir group_vars hosts_vars 
     mkdir group_vars/all
     vim group_vars/all/variables.yml
     var1: "I'm in group_vars all"
     tree
     ansible -i inventory.yml all  -m debug -a 'msg={{ var1 }}'
     #try dbserver target
     ansible -i inventory.yml dbserver -m debug -a 'msg={{ var1 }}'
     
The variable defined under the group_vars directory where you can use 'all' folder to use the variable in all playbooks and roles. if you want to use a specific variables for a specific group you need to define them separately, for db, web groups you may need some variable value will be executed from the dedicated folder

group_varrs example in ansible

That concludes the group_vars will be defined for all as shown above. but we can override them with host_vars, let's see how it is possible now.

specific group variable overrides all group


Let's quickly check how the host_vars are defined and have their precedence with the following experiment



Here we have tested with 'var1', but in real-time project different variables are required. There could be multiple variables need to be defined at each level which will play importance as per the project requirements. For example developers want notifications for webserver group, you can define 'email_to' variable with developers direct group. similar DBA team want to see mails notification when something happen on dbservers.

all:
  children:
    common:
      children:
        webserver:
          hosts:
            node[1:2]:
          vars:
            email_to: "webdeveloper@vybhavatechnologies.com"
        dbserver:
          hosts:
            localhost:
              email_to: "dba@vybhavatechnologies.com"
    vars:
      email_to: "allteams@VybhavaTechnologies"
   
Execution will be as follows:
 
    #try with all: 
    ansible -i inventory.yml all -m debug -a 'msg={{ email_to }}'
    #try with dbserver: 
    ansible -i inventory.yml dbserver -m debug -a 'msg={{ email_to }}'
    

Rule 1: When you create a sub-directory inside group_vars must be name of the group name, inside that you can define variables.yml file.
Rule 2: Defining the host_vars should contain sub-directories only with hostname(node1) where you can have variables.yml file.

Let's examine the host_vars/node1/variables.yml file content with variable 'var1' is defined then it will be overrides the group_vars-> var1 value.


2022
Here is my new learning about host_vars and group_vars experiment hope you enjoyed 
---
# Filename: varexample.yaml
# Extra Varialble targets [optional]: the hosts that will be tested; if nothing specific boxes are set, then localhost will be targeted

 - name: varibles in group_vars and host_vars
   hosts: "{{ targets | default('localhost') }}"
   gather_facts: false
   tasks:
     - debug:
         msg:
           - "var1= {{ var1 }} var1 type: {{ var1 |type_debug }}"
           - "email_to= {{ email_to }} email_to type: {{ email_to |type_debug }}"
Here are multiple usecases for the same playbook executions outputs
# default all groups 
ansible-playbook varexample.yaml 
# specific target as node1 
ansible-playbook varexample.yaml -e targets=node1
# Specific target as webserver group 
ansible-playbook varexample.yaml -e targets=webserver 
group_vars and host_var examples in a Ansible Playbook

Courtesy by: Maheshwari

Every experiment is useful, every moment you spend for learning new things is valuable, Keep LEARNING

Keep Sharing!


H A P P Y   A U TO M A T I ON !! Enjoy with Ansible!!

References:

No comments:

Categories

Kubernetes (24) Docker (20) git (13) Jenkins (12) AWS (7) Jenkins CI (5) Vagrant (5) K8s (4) VirtualBox (4) CentOS7 (3) docker registry (3) docker-ee (3) ucp (3) Jenkins Automation (2) Jenkins Master Slave (2) Jenkins Project (2) containers (2) create deployment (2) docker EE (2) docker private registry (2) dockers (2) dtr (2) kubeadm (2) kubectl (2) kubelet (2) openssl (2) Alert Manager CLI (1) AlertManager (1) Apache Maven (1) Best DevOps interview questions (1) CentOS (1) Container as a Service (1) DevOps Interview Questions (1) Docker 19 CE on Ubuntu 19.04 (1) Docker Tutorial (1) Docker UCP (1) Docker installation on Ubunutu (1) Docker interview questions (1) Docker on PowerShell (1) Docker on Windows (1) Docker version (1) Docker-ee installation on CentOS (1) DockerHub (1) Features of DTR (1) Fedora (1) Freestyle Project (1) Git Install on CentOS (1) Git Install on Oracle Linux (1) Git Install on RHEL (1) Git Source based installation (1) Git line ending setup (1) Git migration (1) Grafana on Windows (1) Install DTR (1) Install Docker on Windows Server (1) Install Maven on CentOS (1) Issues (1) Jenkins CI server on AWS instance (1) Jenkins First Job (1) Jenkins Installation on CentOS7 (1) Jenkins Master (1) Jenkins automatic build (1) Jenkins installation on Ubuntu 18.04 (1) Jenkins integration with GitHub server (1) Jenkins on AWS Ubuntu (1) Kubernetes Cluster provisioning (1) Kubernetes interview questions (1) Kuberntes Installation (1) Maven (1) Maven installation on Unix (1) Operations interview Questions (1) Oracle Linux (1) Personal access tokens on GitHub (1) Problem in Docker (1) Prometheus (1) Prometheus CLI (1) RHEL (1) SCM (1) SCM Poll (1) SRE interview questions (1) Troubleshooting (1) Uninstall Git (1) Uninstall Git on CentOS7 (1) Universal Control Plane (1) Vagrantfile (1) amtool (1) aws IAM Role (1) aws policy (1) caas (1) chef installation (1) create organization on UCP (1) create team on UCP (1) docker CE (1) docker UCP console (1) docker command line (1) docker commands (1) docker community edition (1) docker container (1) docker editions (1) docker enterprise edition (1) docker enterprise edition deep dive (1) docker for windows (1) docker hub (1) docker installation (1) docker node (1) docker releases (1) docker secure registry (1) docker service (1) docker swarm init (1) docker swarm join (1) docker trusted registry (1) elasticBeanStalk (1) global configurations (1) helm installation issue (1) mvn (1) namespaces (1) promtool (1) service creation (1) slack (1)