Getting MAC address from Ansible facts in role

RhythmicDevil picture RhythmicDevil · Oct 24, 2016 · Viewed 10.5k times · Source

I'm trying to get the MAC address for the current host so that I can use the value in a task. Even after reading the docs I cant seem to wrap my head around how to do this. I've been trying to figure out the structure by dumping out the values. The playbook that calls the role does gather facts.

This is what the task has:

- name: Get the MAC address
  debug: msg="{{ hostvars[inventory_hostname] }}"

This produces the following (truncated):

ok: [steve.dev.v4-1-0] => {
    "msg": {
        "ansible_all_ipv4_addresses": [
            "10.1.3.144"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::250:56ff:fe8b:1051"
        ], 
        "ansible_architecture": "x86_64", 
        "ansible_bios_date": "09/21/2015", 
        "ansible_bios_version": "6.00", 
        "ansible_check_mode": false, 
        "ansible_cmdline": {
            "KEYBOARDTYPE": "pc", 
            "KEYTABLE": "us", 
            "LANG": "en_US.UTF-8", 
            "SYSFONT": "latarcyrheb-sun16", 
            "crashkernel": "129M@0M", 
            "quiet": true, 
            "rd_NO_DM": true, 
            "rd_NO_LUKS": true, 
            "rd_NO_LVM": true, 
            "rd_NO_MD": true, 
            "rhgb": true, 
            "ro": true, 
            "root": "UUID=408345fe-146b-4dec-b62c-31fe6d60b376"
        }, 
        "ansible_date_time": {
            "date": "2016-10-24", 
            "day": "24", 
            "epoch": "1477329455", 
            "hour": "10", 
            "iso8601": "2016-10-24T17:17:35Z", 
            "iso8601_basic": "20161024T101735509516", 
            "iso8601_basic_short": "20161024T101735", 
            "iso8601_micro": "2016-10-24T17:17:35.509824Z", 
            "minute": "17", 
            "month": "10", 
            "second": "35", 
            "time": "10:17:35", 
            "tz": "MST", 
            "tz_offset": "-0700", 
            "weekday": "Monday", 
            "weekday_number": "1", 
            "weeknumber": "43", 
            "year": "2016"
        }, 
        "ansible_default_ipv4": {
            "address": "10.1.3.144", 
            "alias": "eth1", 
            "broadcast": "10.1.3.255", 
            "gateway": "10.1.0.10", 
            "interface": "eth1", 
            "macaddress": "00:50:56:8b:10:51", 
            "mtu": 1500, 
            "netmask": "255.255.252.0", 
            "network": "10.1.0.0", 
            "type": "ether"
        }, 

But when I try to reference:

- name: Insert the mac address into the customer license
  debug: msg="{{ hostvars[inventory_hostname][ansible_default_ipv4] }}"

I get this error, which infuriatingly has the data I am looking for:

fatal: [steve.dev.v4-1-0]: FAILED! => {"failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: dict object has no element {u'macaddress': u'00:50:56:8b:10:51', u'network': u'10.1.0.0', u'mtu': 1500, u'broadcast': u'10.1.3.255', u'alias': u'eth1', u'netmask': u'255.255.252.0', u'address': u'10.1.3.144', u'interface': u'eth1', u'type': u'ether', u'gateway': u'10.1.0.10'}\n\nThe error appears to have been in '/opt/deployment_data/playbooks/roles/eti_license/tasks/main.yml': line 13, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Insert the mac address into the customer license\n  ^ here\n"}

What am I doing wrong here?

Answer

Adam Erstelle picture Adam Erstelle · Oct 25, 2016

You need to use dot notation to get the value.

msg="{{ hostvars[inventory_hostname].ansible_default_ipv4.macaddress }}"

http://docs.ansible.com/ansible/playbooks_variables.html#information-discovered-from-systems-facts