2

我正在尝试从标签“名称”设置亚马逊 EC2 主机名

并找到了从实例数据中提取标签的答案。

ec2-describe-tags \
  --filter "resource-type=instance" \
  --filter "resource-id=$(ec2-metadata -i | cut -d ' ' -f2)" \
  --filter "key=Name" | cut -f5

结果是:

+------------+--------------+------+--------+
| resourceId | resourceType | key  | value  |
+------------+--------------+------+--------+
| i-1xxxxxxx | instance     | Name | dev200 |
+------------+--------------+------+--------+

我可以看到我快到了,但是如何从上面的结果中获取 value(dev200) ?然后我可以使用它:

echo $HOSTNAME > /etc/hostname

ps 我在实例上有 BASH,但我完全迷失在bash 文档中。有人可以指出正确的段落吗?

4

2 回答 2

4

经过一些错误和试验后,脚本开始工作:

#!/bin/bash
hostname=`ec2-describe-tags --filter "resource-type=instance" \
  --filter "resource-id=$(ec2-metadata -i | cut -d ' ' -f2)" \
  --filter "key=Name" | grep Name`

IFS="|" read -ra NAME <<< "$hostname"
hostname=${NAME[4]}
echo $hostname

使用 IFS 将字符串解析为数组,幸运的是我知道第 4 个元素始终是主机名。

编辑(2012 年 12 月 20 日):在此发布后的短时间内,一些相关的 ec2 命令行工具已被修改,并且标志已更改或弃用(例如,上面的 -i 标志似乎不再适用当前版本的 ec2metadata)。记住这一点,这是我用来获取当前机器的“​​名称”标签的命令行脚本(不能与脚本的其余部分对话):

ec2-describe-tags --filter "resource-type=instance" --filter "resource-id=$(ec2metadata --instance-id)" | awk '{print $5}'

在 Debian/Ubuntu 上,您需要apt-get install cloud-utils ec2-api-tools让这些工作(后者仅在 Ubuntu Multiverse 上)。

于 2012-09-04T18:42:35.643 回答
0

您可以只使用 curl,因为它通常已安装。

assign_host_name=$(curl ' http://169.254.169.254/latest/meta-data/assigned_host_name ') assign_domain_name=$(curl ' http://169.254.169.254/latest/meta-data/assigned_domain_name ')

然后只需检查分配的值是否不包含如下所示的 404 HTML 消息。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>404 - Not Found</title> </head> <body> <h1>404 - Not Found</h1> </body> </html>

然后做任何你想分配主机名的魔法。我将在今天晚些时候编辑它以添加我是如何做到的。

于 2016-06-05T15:57:57.410 回答