OpenStack Windows实例无法通过API获取服务器IP求助
解决OpenStack API获取实例IP的问题
你遇到的是Nova API默认返回精简字段的问题,列表接口/servers?name=xxx仅返回基础信息,要获取IP可通过以下两种方式:
方式1:调用单个实例的详情接口
利用返回结果中links里的URL,或直接用实例ID构造详情请求,获取完整服务器信息:
$vmName = "vm-name" $url = "http://xx.xx.xx.xx:8774/v2.1/servers?name=$vmName" # $headers 已包含API token $response = Invoke-RestMethod -Method Get -Uri $url -Headers $headers $serverId = $response.servers[0].id # 请求实例详情接口 $detailUrl = "http://xx.xx.xx.xx:8774/v2.1/servers/$serverId" $serverDetail = Invoke-RestMethod -Method Get -Uri $detailUrl -Headers $headers # 提取IP地址(根据实际网络名调整,示例网络名为private) $ipAddresses = $serverDetail.server.addresses.private | ForEach-Object { $_.addr } Write-Output "实例IP:$ipAddresses"
方式2:在列表请求中指定扩展字段
通过添加参数让列表接口返回包含addresses的信息,有两种参数可选:
用detail参数获取全量字段
$vmName = "vm-name" # 带detail参数的列表接口 $url = "http://xx.xx.xx.xx:8774/v2.1/servers/detail?name=$vmName" $response = Invoke-RestMethod -Method Get -Uri $url -Headers $headers $ipAddresses = $response.servers[0].addresses.private | ForEach-Object { $_.addr } Write-Output "实例IP:$ipAddresses"
用fields参数指定仅返回需要的字段(更高效)
$vmName = "vm-name" # 指定返回id、name和addresses字段 $url = "http://xx.xx.xx.xx:8774/v2.1/servers?name=$vmName&fields=id,name,addresses" $response = Invoke-RestMethod -Method Get -Uri $url -Headers $headers $ipAddresses = $response.servers[0].addresses.private | ForEach-Object { $_.addr } Write-Output "实例IP:$ipAddresses"
原因说明
OpenStack Nova API的默认列表接口返回精简视图,仅包含id、name、links等基础字段;而详情接口或带detail参数的列表接口会返回完整视图,包含addresses、flavor、status等所有服务器属性。
内容的提问来源于stack exchange,提问作者Roshin Raphel
相关产品推荐
相关产品推荐

