User Tools

Site Tools


ansible:ansible_variables

This is an old revision of the document!


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",
ansible/ansible_variables.1631523496.txt.gz · Last modified: 2021/09/13 10:58 by manu