如何用Ansible Facts或json_query提取OpenStack服务器MAC地址?
提取OpenStack服务器MAC地址的Ansible解决方案
你可以替换原有的get only the server MAC address任务为以下内容,直接提取纯文本格式的MAC地址:
- name: 提取服务器MAC地址 set_fact: any_server_mac: "{{ servers | community.general.json_query(jmespath_mac) }}" vars: jmespath_mac: 'servers[?name == `{{ server_name }}`].addresses.*[0].`OS-EXT-IPS-MAC:mac_addr` | [0]'
表达式说明
这个JMESPath表达式的逻辑拆解:
servers[?name =={{ server_name }}]:精准筛选出目标名称的服务器条目.addresses.*:通配匹配服务器addresses下的所有VLAN(兼容动态变化的VLAN名称)[0]:获取该VLAN下的第一个网络条目(通常对应固定IP的MAC地址).OS-EXT-IPS-MAC:mac_addr``:提取MAC地址字段(字段名含特殊字符,必须用反引号包裹)| [0]:从结果列表中取出唯一的MAC地址值,得到纯文本格式
执行后,any_server_mac变量将直接存储如fa:0b:ab:f2:9a:20的纯文本MAC地址,无需额外的字符串替换操作。
原方案的问题分析
你之前的表达式存在三个关键错误:
- 字段名拼写错误:将
OS-EXT-IPS-MAC:mac_addr误写为0S-EXT-IPS-MAC:mac_addr - 特殊字段访问方式错误:带冒号的字段名必须用反引号包裹,否则JMESPath无法识别
- 固定VLAN名称限制:如果VLAN名称变化,固定写
VLAN-199会导致匹配失败,用*通配更通用
内容的提问来源于stack exchange,提问作者ibellinf
相关产品推荐
相关产品推荐

