Как я могу получить имя экземпляра GCE, где работает мой скрипт?

В настоящее время я пытаюсь манипулировать метаданными моего экземпляра из сценария запуска. Для этого мне нужно использовать следующую команду:

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

Как вы видите команду, спросите имя экземпляра. Я пытался получить его из метаданных, но его там не было (см.: Метаданные по умолчанию).

У меня вопрос, как получить это имя экземпляра?

Изменить: на данный момент мое единственное решение заключается в добавлении имени экземпляра в качестве метаданных при создании экземпляра:

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

А затем получите его с помощью запроса curl:

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

3 ответа

Решение

Имя экземпляра совпадает с именем хоста, вы можете просто использовать переменную среды $HOSTNAME, например:

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

Это работает для моего экземпляра, который был собран из образа debian-7-wheezy-v20140318.

ОБНОВЛЕНИЕ: вышеописанное прекрасно работает в Debian 7 (Wheezy), но в ОС, где переменная HOSTNAME - это полное доменное имя, а не просто имя хоста, вы должны использовать следующий синтаксис:

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

URL-адрес метаданных Google Cloud Platform поддерживает получение имени экземпляра с помощью 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])?), поэтому можно сократить результат на основе . и используйте первую часть в качестве имени экземпляра.

Лучший способ получить имя экземпляра - использовать hostname Команда, включенная в изображения GCE:

[benoit@my-instance ~]$ hostname
my-instance
Другие вопросы по тегам