12

当我启动一个实例时,我真的希望能够使用 ec2-init 脚本来做一些家务。理想情况下,我希望能够传递用户数据来设置主机名并运行几个初始化脚本(配置木偶等)。

我看到一个名为 ec2-set-hostname 的脚本,但我不确定您是否可以使用它从用户数据中设置任意主机名,或者用户数据的格式需要是什么。

任何人都使用过这些脚本并且知道如何设置主机名并同时运行一些脚本?

提前致谢。

4

4 回答 4

16

最后我决定跳过 ubuntu ec2 脚本并做类似的事情。我研究了使用 Amazon 的 Route53 服务作为名称服务,它很容易启动和运行。

使用 Route53

这就是我所做的;首先,我使用IAM 工具创建了一个具有自由策略权限的用户“route53”,用于与 Route53 服务进行交互

创建 dns 组和用户

iam-groupcreate -g route53 -v
iam-usercreate -u route53 -g route53

为用户创建密钥并记下这些以供以后使用

iam-useraddkey -u route53

授予组访问权限以添加区域和 dns 记录

iam-grouplistpolicies -g route53
iam-groupaddpolicy -p hostedzone -e Allow -g route53 -a route53:* -r '*'

列出组的用户和策略

iam-grouplistusers -g route53
iam-grouplistpolicies -g route53
iam-grouplistpolicies -g route53 -p hostedzone

为了添加和删除 dns 记录条目,我使用了 Route53 的优秀 python 包装器库,cli53。这消除了使用 route53 的很多痛苦。你可以从这里抓住它

https://github.com/barnybug/cli53

在我的例子中,python 脚本在 /usr/bin 中被符号链接为 cli53。您需要设置以下环境变量,其中包含之前为 route53 用户创建的密钥。

export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXXX

然后,您需要为您的域创建一个区域条目,例如 simple.org

cli53.py create simple.org

这应该会返回一个亚马逊域名服务器地址,您可以通过域名注册商将其与您的域名相关联,以便该域的主机名查找将被重定向到 Route53 服务器。

设置区域后,向其中添加和删除条目很简单,例如

cli53 rrcreate simple.org hostname CNAME ec2-184-73-137-40.compute-1.amazonaws.com
cli53 rrdelete simple.org hostname

我们使用带有 ec2 实例的公共 DNS 名称的 CNAME 条目,因为此主机名将解析为外部的公共 IP 和来自 EC2 内部的私有 IP。下面为主机“test2.simple.org”添加一个条目。

cli53 rrcreate simple.org test2 CNAME ec2-184-73-137-40.compute-1.amazonaws.com --ttl 60 --replace

自动设置主机名并更新 Route53

现在剩下的就是设置一个脚本以在机器启动时自动执行此操作。这个解决方案和下面的脚本非常感谢 Marius Ducea 在这里找到的优秀教程

http://www.ducea.com/2009/06/01/howto-update-dns-hostnames-automatically-for-your-amazon-ec2-instances/

它与 Marius 的设置基本相同,但使用的是 Route53 而不是 Bind。

该脚本使用每个 EC2 实例可用的基于 REST 的简单服务,位于

   http://169.254.169.254 

检索实际的公共 DNS 名称并从实例中获取所需的主机名。主机名使用可定制的“用户数据”传递给实例,我们可以在启动实例时指定该用户数据。该脚本需要格式为的用户数据

hostname=test2

该脚本将

  • 从实例用户数据中获取主机名信息
  • 从实例元数据中获取公有 DNS 名称
  • 解析出主机名
  • 将主机名设置为完全限定名称,例如 test2.simple.org,
  • 在 Route53 中为此 FQDN 添加一条 CNAME 记录指向公共 DNS 名称
  • 在当天的消息中写入一个条目,以便用户在登录时可以看到域到 ec2 的映射

将以下内容复制并保存为 /usr/bin/autohostname.sh

#!/bin/bash

DOMAIN=simple.org

USER_DATA=`/usr/bin/curl -s http://169.254.169.254/latest/user-data`
EC2_PUBLIC=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/public-hostname`
HOSTNAME=`echo $USER_DATA| cut -d = -f 2`

#set also the hostname to the running instance
FQDN=$HOSTNAME.$DOMAIN
hostname $FQDN

export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxxxxx

# Update Route53 with a CNAME record pointing the hostname to the EC2 public DNS name
# in this way it will resolve correctly to the private ip internally to ec2 and
# the public ip externally
RESULT=`/root/dns/cli53/cli53.py rrcreate $DOMAIN $HOSTNAME CNAME $EC2_PUBLIC --ttl 60 --replace`
logger "Created Route53 record with the result $RESULT"

# write an MOTD file so that the hostname is displayed on login
MESSAGE="Instance has been registered with the Route53 nameservers as '$FQDN' pointing to ec2 domain name '$EC2_PUBLIC'"

logger $MESSAGE

cat<<EOF > /etc/update-motd.d/40-autohostname
#!/bin/bash
# auto generated on boot by /root/bin/auto_hostname.sh via rc.local
echo "$MESSAGE"

EOF

chmod +x /etc/update-motd.d/40-autohostname

exit 0

为了让脚本在启动时运行,我们在 /etc/rc.local 中添加一行,例如

/usr/bin/autohostname.sh

将测试实例的用户数据更改为“hostname=test2”并重启实例。重新启动后,您应该可以通过 test2.simple.org 登录它。这可能需要几分钟才能正确解决,具体取决于您指定的 TTL。登录时,您应该会看到一条 MOTD 消息告诉您

实例已在 Route53 名称服务器中注册为“test2.simple.org”,指向 ec2 域名“ec2-184-73-137-40.compute-1.amazonaws.com”

一旦您使用测试实例进行此操作,将其备份为 AMI 就很有意义,您可以使用它来创建具有相同自动主机命名功能的其他实例。

高温高压

于 2011-03-28T03:04:33.347 回答
2

我安装了 route53 gem,并写了一个小脚本:

宝石安装 route53

#!/bin/bash
DATE=`date +%Y%m%d%H%M%S`
export HOME=/root
export DEBIAN_FRONTEND=noninteractive
export PATH=/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/local/aws/bin    /usr/local/node:$PATH
export JAVA_HOME=/usr/java/current
export EC2_HOME=/usr/local/aws
export EC2_PRIVATE_KEY=/root/.ec2/pk-XXXXXXXXXXXXXXXXXXXXXXX
export EC2_CERT=/root/.ec2/cert-XXXXXXXXXXXXXXXXXXXX
export EC2_INSTANCE_ID=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
echo "$EC2_INSTANCE_ID"
mkdir  /root/$EC2_INSTANCE_ID
ec2din $EC2_INSTANCE_ID > /root/$EC2_INSTANCE_ID/$EC2_INSTANCE_ID.txt
export FQDN=`cat /root/$EC2_INSTANCE_ID/$EC2_INSTANCE_ID.txt |grep Name |awk '{print $5}'`
export EC2_DNS_NAME=`cat /root/$EC2_INSTANCE_ID/$EC2_INSTANCE_ID.txt |grep INSTANCE |awk '{print $4}'`
/usr/bin/ruby1.8 /usr/bin/route53 -g -z /hostedzone/XXXXXXXX --name $FQDN. --type CNAME --ttl 60 --values $EC2_DNS_NAME > /tmp/route53.out 2>&1

-乔什

于 2011-12-29T23:29:28.527 回答
0

上一个答案中提到的链接不再可用。但它仍然在 Wayback Machine 上可用: <a href="http://web.archive.org/web/20140709022644/http://www.practicalclouds.com/content/blog/1/dave-mccormick/ 2012-02-28/route53-bring-back-some-dns-lovin-ec2" rel="nofollow">http://web.archive.org/web/20140709022644/http://www.practicalclouds.com/内容/博客/1/dave-mccormick/2012-02-28/route53-bring-back-some-dns-lovin-ec2

于 2015-04-29T20:30:31.147 回答
0

我对“sgargan”采取了类似的方法,允许实例在 Route 53 中创建自己的 DNS 记录,但我使用了 phython AWS 库“boto”并配置了“systemd”(init/ Fedora 15/16 中发布的新贵替代品)以在主机关闭时删除 dns 条目。

请参阅以下演练如何做到这一点: -

http://www.practicalclouds.com/content/blog/1/dave-mccormick/2012-02-28/using-route53-bring-back-some-dns-lovin-your-cloud

虽然在外部 DNS 区域文件中公开您的内部 ips 并不理想,但在亚马逊创建内部 DNS 服务之前,我认为最好运行您自己的 BIND 实例。

于 2012-02-28T22:47:29.010 回答