5

我目前正在尝试从启动脚本中操作我的实例的元数据。为此,我必须使用以下命令:

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

如您所见,该命令要求输入instance-name。因为我试图从元数据中获取它,但它不存在(请参阅:默认元数据)。

我的问题是如何获取此实例名称?

编辑:目前我唯一的解决方案是在创建实例时将实例名称添加为元数据:

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"
4

3 回答 3

4

Google Cloud Platform MetaData URL 支持通过hostname资源获取实例名称,而不管为实例设置的任何自定义主机名。这$HOSTNAME就是不推荐的原因。

网址1:

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

网址2:

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])?),因此可以安全地根据第一部分剪切结果.并将第一部分用作实例名称。

于 2016-12-19T23:33:07.207 回答
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>
于 2014-03-25T11:40:43.970 回答
0

获取实例名称的更好方法是使用hostnameGCE 映像中包含的命令:

[benoit@my-instance ~]$ hostname
my-instance
于 2014-03-30T11:42:21.223 回答