从Ansible事实角色获取MAC地址

时间:2016-10-24 17:48:33

标签: ansible ansible-playbook ansible-facts

我试图获取当前主机的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"}

我在这里做错了什么?

2 个答案:

答案 0 :(得分:7)

您需要使用点表示法来获取值。

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

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

答案 1 :(得分:3)

您的问题是您传递的是变量:

{{ hostvars[inventory_hostname][ansible_default_ipv4] }}

你应该这样做:

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

或者你可以这样做:

{{ ansible_default_ipv4["field"] }}

或者:

{{ ansible_default_ipv4.field }}

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