从角色中的 Ansible 事实中获取 MAC 地址

Getting MAC address from Ansible facts in role

我正在尝试获取当前主机的 MAC 地址,以便我可以在任务中使用该值。即使在阅读了文档之后,我似乎也无法全神贯注于如何做到这一点。我一直试图通过倾倒值来弄清楚结构。调用角色的剧本确实收集了事实。

这是任务的内容:

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

这会产生以下内容(截断):

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"
        }, 

但是当我尝试引用时:

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

我收到此错误,其中包含我正在寻找的数据:

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"}

我做错了什么?

您可以使用点符号来获取值。

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

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

你的问题是你正在传递一个变量:

{{ hostvars[inventory_hostname][ansible_default_ipv4] }}

你应该这样做:

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

或者你可以这样做:

{{ ansible_default_ipv4["field"] }}

或者:

{{ ansible_default_ipv4.field }}

原因是在使用字典的时候,需要传递一个字段名。如果您传递一个字符串(带引号),那将是您想要获取的字段。如果你不传递一个字符串(不带引号),那么它将是一个包含你想要获取的字段的变量。