1

我正在尝试红宝石雾vsphere示例:

#!/usr/bin/env ruby

require 'rubygems'
require 'pp'
require 'fog'
require 'highline/import'

def get_password(prompt="Enter password:")
   ask(prompt) {|q| q.echo = false}
end

#user = gets.chomp
pass = get_password()

credentials = {
    :provider   => "vsphere",
    :vsphere_username   => "user.name",
    :vsphere_password   => pass,
    :vsphere_server => "my_vcserver",
    :vsphere_ssl    => true,
    :vsphere_expected_pubkey_hash   => "my_hash",
    :vsphere_rev    => "4.0"
}
connection = Fog::Compute.new(credentials)

# MUST BE Ruby v 1.9 to use this hash style
vms = connection.list_virtual_machines(datacenter: 'my_dc', folder: 'my_folder')
pp vms

它连接并返回数据,但是有几个属性没有显示正确的数据,而是显示了看起来像 Proc 对象的内容。我对 mac_addresses 属性感兴趣。如何从该对象中获取数据?

{"id"=>"52e9592f-4da9-c5b4-a78e-92d39705d900",
  "name"=>"a41",
  "uuid"=>"784d4e21-e4a7-e059-cdef-4ff1453f093d",
  "template"=>false,
  "parent"=>Folder("group-v16163"),
  "hostname"=>nil,
  "operatingsystem"=>nil,
  "ipaddress"=>nil,
  "power_state"=>"poweredOn",
  "connection_state"=>"connected",
  "hypervisor"=>
   #<Proc:0x00000004922d50@/opt/rh/ruby193/root/usr/local/share/gems/gems/fog-1.22.0/lib/fog/vsphere/compute.rb:150>,
  "tools_state"=>"toolsNotInstalled",
  "tools_version"=>"guestToolsNotInstalled",
  "memory_mb"=>8192,
  "cpus"=>2,
  "corespersocket"=>2,
  "overall_status"=>"green",
  "guest_id"=>"centos64Guest",
  "mo_ref"=>"vm-16217",
  "datacenter"=>
   #<Proc:0x00000004922fa8@/opt/rh/ruby193/root/usr/local/share/gems/gems/fog-1.22.0/lib/fog/vsphere/compute.rb:148>,
  "cluster"=>
   #<Proc:0x00000004922e68@/opt/rh/ruby193/root/usr/local/share/gems/gems/fog-1.22.0/lib/fog/vsphere/compute.rb:149>,
  "resource_pool"=>
   #<Proc:0x00000004922c60@/opt/rh/ruby193/root/usr/local/share/gems/gems/fog-1.22.0/lib/fog/vsphere/compute.rb:151>,
  "mac_addresses"=>
   #<Proc:0x00000004922b48@/opt/rh/ruby193/root/usr/local/share/gems/gems/fog-1.22.0/lib/fog/vsphere/compute.rb:155>,
  "path"=>"/Datacenters/DEV/vm",
  "relative_path"=>"DEV"}
4

1 回答 1

1

您可以简单地调用 proc 来检索数据:

my_data['mac_addresses'].()

如果此时fog能够采集到数据,则返回mac地址,否则返回nil。Foq 使用这种技术来延迟评估一些在哈希编译期间可能不可用但需要额外调用 vsphere 管理程序的属性。

要引用相应源文件中的评论:

在这里,我们创建此方法返回的哈希对象,但首先我们需要添加一些需要额外调用 vSphere API 的属性。虚拟机管理程序名称和 mac_addresses 属性可能不可用,因此我们需要捕获在查找期间抛出的任何异常并将它们设置为 nil。

于 2014-05-02T22:27:38.603 回答