Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting MAC address from Ansible facts in role

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?

like image 973
RhythmicDevil Avatar asked Oct 24 '16 17:10

RhythmicDevil


2 Answers

You could 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

like image 149
Adam Erstelle Avatar answered Oct 05 '22 15:10

Adam Erstelle


Your problem is you are passing a variable:

{{ hostvars[inventory_hostname][ansible_default_ipv4] }}

You should instead do:

{{ hostvars[inventory_hostname]["ansible_default_ipv4"] }}

Or you could just do:

{{ ansible_default_ipv4["field"] }}

Or:

{{ ansible_default_ipv4.field }}

The reason is that when using dictionaries, you have to pass a field name. If you pass a string (quoted), that will be the field you want to get. If you don't pass a string (unquoted), then it will be a variable containing the field you want to get.

like image 41
David Barroso Avatar answered Oct 05 '22 16:10

David Barroso