Ansible Variables can be used within Playbooks but also within the inventory. When we look at the Apache Web Server package in Ubuntu it is apache2, in Enterprise Linux variants, it is httpd. Adding Ansible Variables to the inventory helps document the differences and makes the design of Playbooks, play and tasks more simple. Even though we do have to install packages with the yum module on RHEL and the apt module on Debian based systems such as Ubuntu, at least we can keep the package name consistent if we use variables.
INI Inventory with Variables
$ vim inventory 192.168.122.[4:6] [rhel8] 192.168.122.[4:5] [ubuntu1804] 192.168.122.6 [peterborough] 192.168.122.[4:6] [development] 192.168.122.[4:6] [uk:children] peterborough [rhel:children] rhel8 [rhel:vars] apache_package=http [ubuntu:children] ubuntu1804 [ubuntu:vars] apache_package=apache2
We add INI blocks with the square bracket that define the group name that the Ansible Variables should be assigned to with the keyword *vars*. The lines following will then be the variables and values. Ansible Variable names must start with a letter, and they can only contain letters, numbers, and underscores. If we are not careful the variables definition blocks can become separated from the groups they support. Even though they will still work it is less easy to read and manage. YAML inventories make the task easier.
YAML Inventory with Variables
all: children: development: hosts: 192.168.122.4: {} 192.168.122.5: {} 192.168.122.6: {} rhel: children: rhel8: hosts: 192.168.122.4: {} 192.168.122.5: {} vars: apache_package: httpd ubuntu: children: ubuntu1804: hosts: 192.168.122.6: {} vars: apache_package: apache2 uk: children: peterborough: hosts: 192.168.122.4: {} 192.168.122.5: {} 192.168.122.6: {} ungrouped: {}
The Ansible Variables are stored within the definition of the parent group and cannot be separated and lost. If we want to see the use of the variables we can use an ad-hoc command to install the Apache Web Server.
Using Variables in Ad-Hoc Commands
$ ansible ubuntu -m apt -a 'name="{{ apache_package }}" state=latest' $ ansible rhel -m yum -a 'name="{{ apache_package }}" state=latest'
NOTE: For clarity and brevity the output of the command has been omitted. If the Web Server was not installed it will be installed. For ubuntu we use the apt module and for rhel we use the yum module.
Using the variable we only need to change the module name, we can leave the package name untouched. The name of the package would normally be written as name=httpd or name=apache2; when we use variables we need to quote and use the double brace bracket. Hence it becomes name=”{{ apache_package }}”