从角色中的 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 }}
原因是在使用字典的时候,需要传递一个字段名。如果您传递一个字符串(带引号),那将是您想要获取的字段。如果你不传递一个字符串(不带引号),那么它将是一个包含你想要获取的字段的变量。
我正在尝试获取当前主机的 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 }}
原因是在使用字典的时候,需要传递一个字段名。如果您传递一个字符串(带引号),那将是您想要获取的字段。如果你不传递一个字符串(不带引号),那么它将是一个包含你想要获取的字段的变量。