2014-03-25 62 views
2

我目前正在試圖從啓動腳本操縱我的實例的元數據。要做到這一點我必須使用下面的命令:如何獲得腳本運行的GCE實例名稱?

gcutil setinstancemetadata <instance-name> --metadata=<key-1:value-1> --fingerprint=<current-fingerprint-hash> 

正如你所看到的命令索要實例名稱。因爲我試圖從元數據中獲取它,但它不在那裏(請參閱:Default Metadata)。

我的問題是如何得到這個實例名?

編輯:現在我唯一的解決辦法是將實例名稱添加爲元數據,當我創建實例:

gcutil addintance my-cool-instance --metadata=instance-name:my-cool-instance 

,然後用捲曲的請求得到它:

curl 'http://metadata/computeMetadata/v1/instance/attributes/instance-name' -H "X-Google-Metadata-Request: True" 

回答

1

實例名稱與其主機名稱相同,您可以使用$ HOSTNAME環境變量,例如:

gcutil setinstancemetadata $HOSTNAME --metadata=<key-1:value-1> --fingerprint=<current-fingerprint-hash> 

這適用於我從debian-7-wheezy-v20140318圖像構建的實例。

UPDATE:上述工作正常,在Debian 7(喘息),但在操作系統的其中的HOSTNAME變量是完全合格的域名,而不僅僅是主機名,你應該使用下面的語法:

gcutil setinstancemetadata $($HOSTNAME | cut -d . -f1) --metadata=<key-1:value-1> --fingerprint=<current-fingerprint-hash> 
+0

謝謝你的迴應。在CentOS上,主機名似乎有點不同:'my-cool-instance.c.my-cool-project.xxxx.com.yyyyy'。我只是添加一個'剪切'而已解決。 –

+1

並非所有的實例名稱都與主機名相同。如果你有自定義的主機名呢?在這種情況下,實例的名稱與主機名不同。 – Baskar

-1

更有效的手段來獲得實例名稱是使用包含在GCE圖像hostname命令:

[[email protected] ~]$ hostname 
my-instance 
+0

這不會得到通常包含項目名稱的完整gce主機名。 – simonmorley

1

谷歌雲平臺元URL支持通過hostname資源獲取實例名稱,不論任何卡斯特的爲實例設置的主機名。這就是爲什麼不推薦$HOSTNAME的原因。

URL1:

INSTANCE_NAME=$(curl http://169.254.169.254/0.1/meta-data/hostname -s | cut -d "." -f1) 

URL2:

INSTANCE_NAME=$(curl http://metadata.google.internal/computeMetadata/v1/instance/hostname -H Metadata-Flavor:Google | cut -d . -f1) 

GCP遵循資源名稱(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?)常見的正則表達式模式,因此它是安全的削減基礎上.和使用結果第一部分作爲實例名稱。