Variables play a important role in every programming language. Ansible also provides various ways of setting variables. They are used to store values that can be later used in the playbook. Facts regarding the remote machine can also be fetched as variables and used.
Declaration
Variable
names in Ansible should start with a letter. The variable can have letter,
numbers and underscore. Invalid variable declaration comes when we use dot (.),
a hyphen (-), a number or variable separated by mutlple words.
Varaibles
in Ansible can be set in different ways. They are
Passing
a Varaible file
Declaring
them in the playbook
Passing
them to the Ansible-playbook command using the –e/--extra-vars argument
Declaring
them in the inventory file
Lets
see how we can define variables in Ansible and use them.
Passing a Varaible file - A Varaible can be defined in a variable file and can be
passed to a playbook using the include
Lets
create a install_apache.yml file with the below content,
[root@vx111a
2test]# cat install_apache.yml
-
set_fact: package_name=httpd
-
name: install Apache
yum: name=httpd state=present
In
the above yml file, we have defines a variable “package_name” which was given a
value of httpd. After that we are installing the Apache Package. Now we will
use this yml file into our playbook as,
---
-
hosts: dev
tasks:
-
include: install_apache.yml
- name: check Apache Service
service: name={{ package_name }}
state=restarted
If
you check the above playbook, we can see that we have used a include element
for including the install_apache.yml file. We also defined a task for
restarting the httpd using the Service module. We have defined to access the
package_name using the service:
name={{ package_name }} state=restarted . Now lets run the playbook
[root@vx111a
2test]# ansible-playbook test.yml
PLAY
[dev] ********************************************************************
GATHERING
FACTS ***************************************************************
ok:
[172.16.202.96]
TASK:
[set_fact package_name=httpd] *******************************************
ok:
[172.16.202.96]
TASK:
[install Apache] ********************************************************
ok:
[172.16.202.96]
TASK:
[check Apache Service] **************************************************
changed:
[172.16.202.96]
PLAY
RECAP ********************************************************************
172.16.202.96 : ok=4 changed=1
unreachable=0 failed=0
We
can see that the play book ran perfectly fine with accessing the variable name
package_name from the install_apache.yml file that we included.
Another
way of passing variable file to the playbook is by using the vars_file
declaration as
[root@vx111a
2test]# cat test1.yml
---
-
hosts: dev
vars_files:
- var1.yml
tasks:
- name: install httpd Package
yum: name=httpd state=present
- name: restart Apache
service: name="{{ package_name
}}" state=restarted
Now
the var1.yml file contains the variables that we need to define as
[root@vx111a 2test]# cat var1.yml
---
package_name:
"httpd"
Declaring them in the playbook – Ansible allows variables to be defined in the Playbook
it self. Variables in the playbook can be defined using the vars declaration as
[root@vx111a
2test]# cat apache.yml
---
-
hosts: dev
vars:
- package_name: "httpd"
tasks:
- name: install httpd Package
yum: name=httpd state=present
- name: restart Apache
service: name="{{ package_name
}}" state=restarted
If
we run the playbook we can see the below
output which is fine
[root@vx111a
2test]# ansible-playbook test1.yml
PLAY
[dev] ********************************************************************
GATHERING
FACTS ***************************************************************
ok:
[172.16.202.96]
TASK:
[install httpd Package] *************************************************
ok:
[172.16.202.96]
TASK:
[restart Apache] ********************************************************
changed:
[172.16.202.96]
PLAY
RECAP ********************************************************************
172.16.202.96 : ok=3 changed=1
unreachable=0 failed=0
Passing them to the Ansible-playbook
command using the –e/--extra-vars argument – Another
way of passing arguments is by passing them to the command line while running
using the –extra-vars parameter.
Lets
use the same above playbook,
[root@vx111a
2test]# cat apache.yml
---
-
hosts: dev
vars:
- package_name: "httpd"
tasks:
- name: install httpd Package
yum: name=httpd state=present
- name: restart Apache
service: name="{{ package_name
}}" state=restarted
Now
while running the playbook we can pass the argument with values as
[root@vx111a
2test]# ansible-playbook apache.yml --extra-vars "package_name=httpd"
PLAY
[dev] ********************************************************************
GATHERING
FACTS ***************************************************************
ok:
[172.16.202.96]
TASK:
[install httpd Package] *************************************************
ok:
[172.16.202.96]
TASK:
[restart Apache] ********************************************************
changed:
[172.16.202.96]
PLAY
RECAP ********************************************************************
172.16.202.96 : ok=3 changed=1
unreachable=0 failed=0
We
have passed the –extra-vars “package_name=httpd” to the command line argument
which will replace the values available.
Declaring them in the inventory file -
All of the preceding
variables are applied globally to all hosts
against which you are running your Ansible playbook. You might sometimes need
to use a specific list of variables for a specific host. Ansible supports this
by declaring your variables inside an inventory file.
[root@vx111a
inventory]# cat hosts
172.16.202.96
db_name=test
Using the following inventory file, you can access the variable db_name for the 172.16.2302.96 host.
Thanks, It was were helpful and Great work
ReplyDeletevery clean presentation thanks keep udating
ReplyDelete