我目前正在尝试从启动脚本中操作我的实例的元数据。为此,我必须使用以下命令:
gcutil setinstancemetadata <instance-name> --metadata=<key-1:value-1> --fingerprint=<current-fingerprint-hash>
如您所见,该命令要求 instance-name 。因为我试图从元数据中获取它,但它不存在(参见: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"
答案 0 :(得分:2)
Google Cloud Platform MetaData 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])?)
的通用正则表达式模式,因此可以安全地根据.
剪切结果并使用第一部分作为实例名称。
答案 1 :(得分:1)
实例名称与其主机名相同,您可以使用$ 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>
答案 2 :(得分:-1)
获取实例名称的更好方法是使用GCE图像中包含的hostname
命令:
[benoit@my-instance ~]$ hostname
my-instance