Ruby无法从Azure实例元数据服务获取Azure VM元数据

时间:2019-05-23 21:16:33

标签: ruby azure metadata

根据MS文档https://docs.microsoft.com/en-us/azure/virtual-machines/windows/instance-metadata-service Azure在“ http://169.254.169.254/metadata/instance?api-version=2017-08-01”处提供实例元数据服务。 但是我无法使用ruby在其中一台VM上获取元数据。同时,我可以使用PowerShell获得元数据。 操作系统环境:Windows Server 2012R2。 Ruby版本:ruby 2.5.3p105(2018-10-18修订版65156)[x64-mingw32] PowerShell版本:4.0

PowerShell代码:

Invoke-WebRequest -Headers @{"Metadata"="true"} -URI "http://169.254.169.254/metadata/instance?api-version=2017-08-01"

PowerShell代码的响应:

StatusCode        : 200
StatusDescription : OK
...

Ruby代码:

require 'net/http'

AZURE_METADATA_ADDR = "169.254.169.254".freeze unless defined?(AZURE_METADATA_ADDR) 
AZURE_METADATA_URL = "/metadata/instance?api-version=2017-08-01".freeze unless defined?(AZURE_METADATA_URL)

def http_get(uri) 
conn = Net::HTTP.start(AZURE_METADATA_ADDR) 
conn.read_timeout = 6 
conn.get(uri, { "Metadata" => "true" }) 
end

puts "Fetching metadata from host #{AZURE_METADATA_ADDR} at #{AZURE_METADATA_URL}" 
response = http_get(AZURE_METADATA_URL)

puts response 

来自Ruby代码的响应:

Fetching metadata from host 169.254.169.254 at /metadata/instance?api-version=2017-08-01 
#<Net::HTTPNotFound:0x0000000002372128> 

任何人都可以建议如何继续解决此问题? Ruby内部有问题吗? PS。这是由厨师客户提供的嵌入式Ruby

2 个答案:

答案 0 :(得分:0)

所以,这对我有用:

require 'net/http'
require 'json'

http = Net::HTTP.new('169.254.169.254', '80')
request = Net::HTTP::Get.new('/metadata/instance?api-version=2020-06-01')
request['Metadata'] = 'true'
response = http.request(request)
JSON.parse(response.body)

...在Ruby 2.5.5上。我看到的唯一明显区别是显式端口设置为“ 80”。

答案 1 :(得分:0)

原来是环境变量“ http_proxy”阻止ruby访问端点。解决方法是设置“ no_proxy”环境变量,并在“ no_proxy”列表中设置“ 169.254.169.254”。

Ruby尊重“ http_proxy”,而其他语言(如Powershell和Java)则不尊重它。