Ruby 无法从 Azure 实例元数据服务获取 Azure VM 元数据
Ruby cannot get Azure VM metadata from Azure Instance Metadata service
根据 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 在我的一台虚拟机上获取元数据。同时,我可以使用 PowerShell 获取元数据。
OS 环境:Windows 服务器 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
所以,这对我有用:
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”。
原来是环境变量“http_proxy”阻止了ruby访问端点。解决方法是设置“no_proxy”环境变量,在“no_proxy”列表中设置'169.254.169.254'。
Ruby 支持“http_proxy”,而 powershell 和 java 等其他语言不支持它。
根据 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 在我的一台虚拟机上获取元数据。同时,我可以使用 PowerShell 获取元数据。 OS 环境:Windows 服务器 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所以,这对我有用:
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”。
原来是环境变量“http_proxy”阻止了ruby访问端点。解决方法是设置“no_proxy”环境变量,在“no_proxy”列表中设置'169.254.169.254'。
Ruby 支持“http_proxy”,而 powershell 和 java 等其他语言不支持它。