====== Ansible variables ======
===== Understanding variable precedence =====
Ansible does apply variable precedence, and you might have a use for it. Here is the order of precedence from least to greatest (the last listed variables override all other variables):
command line values (for example, -u my_user, these are not variables)
role defaults (defined in role/defaults/main.yml) 1
inventory file or script group vars 2
inventory group_vars/all 3
playbook group_vars/all 3
inventory group_vars/* 3
playbook group_vars/* 3
inventory file or script host vars 2
inventory host_vars/* 3
playbook host_vars/* 3
host facts / cached set_facts 4
play vars
play vars_prompt
play vars_files
role vars (defined in role/vars/main.yml)
block vars (only for tasks in block)
task vars (only for the task)
include_vars
set_facts / registered vars
role (and include_role) params
include params
extra vars (for example, -e "user=my_user")(always win precedence)
In general, Ansible gives precedence to variables that were defined more recently, more actively, and with more explicit scope. Variables in the defaults folder inside a role are easily overridden. Anything in the vars directory of the role overrides previous versions of that variable in the namespace. Host and/or inventory variables override role defaults, but explicit includes such as the vars directory or an include_vars task override inventory variables.
===== Example in a playbook =====
Ex: yml file
- hosts: webservers
vars:
http_port: 80
base_path: http://ansibile.local/wiki
app_path: {{ base_path }}/{{ http_port }}
===== variables: facts =====
Facts are variable collected each time you contact a client. It contains IP adresses, OS type, level, hardware....
To improve you ansible command, you can use cache on server into /etc/ansible/ansible.cfg (here cache is valid for 1 hour)
[defaults]
fact_caching = jsonfile
fact_caching_timeout = 3600
fact_caching_connection = /tmp/myfacts
You can call them on the ansible server by using the command (xml output):
opensuse:~ # ansible -m setup localhost
localhost | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"10.1.3.22"
],
"ansible_all_ipv6_addresses": [
"fe80::209a:12e0:e8a7:8ea"
],
"ansible_apparmor": {
"status": "enabled"
},
"ansible_architecture": "x86_64",
"ansible_cmdline": {
"BOOT_IMAGE": "/boot/vmlinuz-4.12.14-lp151.28.91-default",
},
"ansible_date_time": {
"date": "2021-09-13",
"day": "13",
"epoch": "1631520866",
"hour": "10",
"minute": "14",
"month": "09",
"second": "26",
"time": "10:14:26",
"tz": "CEST",
"tz_offset": "+0200",
"weekday": "Monday",
"weekday_number": "1",
"weeknumber": "37",
"year": "2021"
},
...
"ansible_distribution": "openSUSE Leap",
"ansible_distribution_file_parsed": true,
"ansible_distribution_file_path": "/etc/os-release",
"ansible_distribution_file_variety": "SUSE",
"ansible_distribution_major_version": "15",
"ansible_distribution_release": "1",
"ansible_distribution_version": "15.1",
Example of facts on AIX
{
"_ansible_facts_gathered": true,
"ansible_all_ipv4_addresses": [
"10.10.10.100"
],
"ansible_all_ipv6_addresses": [
"::1%1"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "chrp",
"ansible_date_time": {
...
},
"ansible_distribution": "AIX",
"ansible_distribution_major_version": "7",
"ansible_distribution_release": "2",
"ansible_distribution_version": "7.2",
"ansible_nodename": "myaixhost",
"ansible_os_family": "AIX",
"ansible_pkg_mgr": "yum",
"ansible_processor": "PowerPC_POWER8",
"ansible_processor_cores": 8,
"ansible_processor_count": 1,
"ansible_product_name": "IBM,8284-22A",
"ansible_product_serial": "21xxxxV",
Example on linux ppc64le
{
"_ansible_facts_gathered": true,
"ansible_all_ipv4_addresses": [
"10.x.x.x0"
],
"ansible_all_ipv6_addresses": [
"fe80::5b6c:b599:xxx9:xxxc"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "ppc64le",
"ansible_bios_date": "NA",
"ansible_bios_vendor": "NA",
"ansible_bios_version": "NA",
"ansible_board_asset_tag": "NA",
"ansible_board_name": "NA",
"ansible_board_serial": "NA",
"ansible_board_vendor": "NA",
"ansible_board_version": "NA",
"ansible_chassis_asset_tag": "NA",
"ansible_chassis_serial": "NA",
"ansible_chassis_vendor": "NA",
"ansible_chassis_version": "NA",
"ansible_cmdline": {
"BOOT_IMAGE": "/vmlinuz-4.18.0-240.el8.ppc64le",
"ansible_distribution": "CentOS",
"ansible_distribution_file_parsed": true,
"ansible_distribution_file_path": "/etc/redhat-release",
"ansible_distribution_file_variety": "RedHat",
"ansible_distribution_major_version": "8",
"ansible_distribution_release": "NA",
"ansible_distribution_version": "8.4",
"ansible_nodename": "mylnxhost",
"ansible_os_family": "RedHat",
==== How to Create and Use Custom Facts in Ansible ====
Custom facts (local facts) are the variables which are declared on ansible managed host. Custom facts are declared in ini or json file in the /etc/ansible/facts.d directory on managed host. File names of custom facts must have .fact extension.
https://www.linuxtechi.com/create-use-custom-facts-in-ansible/
Get the value of a variable Ex: var1
opensuse:~ # ansible -i "node2," all -e "var1=toto" -m debug -a 'msg={{ var1 }}'
===== Ansible inventory =====
$ ansible --version | grep 'config file'
config file = /home/tux/.ansible.cfg
$ ansible-config dump --only-changed
DEFAULT_BECOME(/home/tux/.ansible.cfg) = True
DEFAULT_BECOME_METHOD(/home/tux/.ansible.cfg) = sudo
DEFAULT_HOST_LIST(/home/tux/.ansible.cfg) = ['/home/tux/
inventory']
DEFAULT_REMOTE_USER(/home/tux/.ansible.cfg) = ansible
List all hosts, use the keyword **all**. To specify all host not in a group use **ungrouped**
$ ansible all --list-hosts
hosts (21):
green.example.com
blue.example.com
192.168.100.1
192.168.100.10
alpha.example.org
beta.example.org
www001.example.com
www002.example.com
www003.example.com
db-99-node.example.com
db-100-node.example.com
db-101-node.example.com
List the group webservers
$ ansible webservers --list-hosts
hosts (10):
alpha.example.org
beta.example.org
192.168.1.100
192.168.1.110
www001.example.com
www002.example.com
www003.example.com
Print inventory in YML format
$ ansible-inventory --list --yaml
all:
children:
ungrouped:
hosts:
172.16.120.161: {}
172.16.120.185: {}
172.16.120.188: {}
===== Custom variable =====
==== Time / date ====
- hosts: test
vars:
time: "{{ lookup('pipe', 'date -d \"1 day ago\" +\"%Y%m%d\"') }}"