Назад | Перейти на главную страницу

Как получить доступ к метаданным Facter 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"=>{"12345-compute@developer.gserviceaccount.com"=>{"aliases"=>["default"], "email"=>"12345-compute@developer.gserviceaccount.com", "scopes"=>["xxx"]}, "default"=>{"aliases"=>["default"], "email"=>"12345-compute@developer.gserviceaccount.com", "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"=>["...

Есть ли какой-либо простой способ доступа, например, к атрибуту «зона» из модуля марионетки, или мне нужно самому разбирать эту строку?

Доступ к нему как к хешу не удается:

gce is not a hash or array

Ошибка gce is not a hash or array предполагает, что вы используете Puppet 3.x (а не 4.x), который обрабатывает все факты как строки, поэтому для доступа к значению внутри хэша вам нужно будет включить выключен в stringify_facts установка.

Это можно сделать в puppet.conf на всех ваших агентах с помощью:

stringify_facts = false

Затем вы сможете получить доступ к значению, используя:

$gce["zone"]

Я не думаю, что командная строка facter может распечатать значение вложенного факта, такого как gce.zone, поэтому вам, вероятно, потребуется его проанализировать.

Обратите внимание на пару вещей:

  1. Вы можете передать имя факта верхнего уровня в командной строке, чтобы оно выводило только его: facter gce напечатает только хеш без префикса "gce =>" или необходимость использования grep.
  2. Вы можете вывести факт в форматах JSON или YAML, чтобы упростить анализ.

С помощью jgrep вы могли бы сделать:

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 }'