如何访问 GCE 元数据

如何访问 GCE 元数据

Facter包含GCE(Google Compute Engine)元数据详细信息:

$ facter | grep gce
gce => {"instance"=>{"attributes"=>{}, "description"=>"", "disks"=>[{"deviceName"=>"srvpup01", "index"=>0, "mode"=>"READ_WRITE", "type"=>"PERSISTENT"}, {"deviceName"=>"srvpup01-storage01", "index"=>1, "mode"=>"READ_WRITE", "type"=>"PERSISTENT"}], "hostname"=>"srvpup01.c.example.internal", "id"=>12345, "image"=>nil, "licenses"=>[{"id"=>"1000010"}], "machineType"=>"n1-standard-1", "maintenanceEvent"=>"NONE", "networkInterfaces"=>[{"accessConfigs"=>[{"externalIp"=>"", "type"=>"ONE_TO_ONE_NAT"}], "forwardedIps"=>[], "ip"=>"123.456.789.123", "ipAliases"=>[], "mac"=>"00:11:22:33:44:55", "network"=>"example"}], "scheduling"=>{"automaticRestart"=>"TRUE", "onHostMaintenance"=>"MIGRATE", "preemptible"=>"FALSE"}, "serviceAccounts"=>{"[email protected]"=>{"aliases"=>["default"], "email"=>"[email protected]", "scopes"=>["xxx"]}, "default"=>{"aliases"=>["default"], "email"=>"[email protected]", "scopes"=>["xxx"]}}, "tags"=>["no-public-ip"], "zone"=>"europe-west1-d"}, "project"=>{"attributes"=>{"google-compute-default-region"=>"europe-west1", "google-compute-default-zone"=>"europe-west1-d", "sshKeys"=>["...

是否有任何简单的方法可以从 puppet 模块内部访问例如“zone”属性,或者我必须自己解析该字符串?

像哈希一样访问它会失败:

gce is not a hash or array

答案1

该错误gce is not a hash or array表明你使用的是 Puppet 3.x(而不是 4.x),它将所有事实视为字符串,因此要访问哈希内的值,你需要打开离开stringify_facts环境

您可以在所有代理的 puppet.conf 中通过以下方式完成此操作:

stringify_facts = false

然后您应该能够使用以下命令访问该值:

$gce["zone"]

答案2

我认为 facter 命令行无法打印出嵌套事实(如 gce.zone)的值,因此您可能需要对其进行解析。

请注意以下几点:

  1. 您可以在命令行上传递顶级事实的名称,这样它只会打印出来:facter gce将只打印没有“gce =>”前缀的哈希,或者需要 grep。
  2. 您可以以 JSON 或 YAML 格式输出事实,以便于解析。

使用上传者你可以这样做:

facter --json gce | jgrep -s gce.zone

或者使用 YAML 和 Ruby,你可以执行以下操作:

facter --yaml gce | ruby -ryaml -e 'p YAML.load(STDIN)["gce"]["zone"]'

或者使用 YAML 和 awk:

facter --yaml gce | awk '/zone:/ { print $2 }'

相关内容