在EC2上使用带有Ubuntu的ec2-init脚本 - 自动设置主机名并向Route53注册

sga*_*gan 12 initialization init.d amazon-ec2

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

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

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

提前致谢.

sga*_*gan 16

最后我决定跳过ubuntu ec2脚本并做类似的事情.我考虑使用亚马逊的Route53服务作为名称服务,它很容易启动和运行.

使用Route53

这就是我所做的; 首先,我使用IAM工具创建一个用户'route53',其具有宽松的策略权限,以便与Route53服务进行交互

创建DNS组和用户

iam-groupcreate -g route53 -v
iam-usercreate -u route53 -g route53
Run Code Online (Sandbox Code Playgroud)

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

iam-useraddkey -u route53
Run Code Online (Sandbox Code Playgroud)

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

iam-grouplistpolicies -g route53
iam-groupaddpolicy -p hostedzone -e Allow -g route53 -a route53:* -r '*'
Run Code Online (Sandbox Code Playgroud)

列出组的用户和策略

iam-grouplistusers -g route53
iam-grouplistpolicies -g route53
iam-grouplistpolicies -g route53 -p hostedzone
Run Code Online (Sandbox Code Playgroud)

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

https://github.com/barnybug/cli53

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

export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXXX
Run Code Online (Sandbox Code Playgroud)

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

cli53.py create simple.org
Run Code Online (Sandbox Code Playgroud)

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

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

cli53 rrcreate simple.org hostname CNAME ec2-184-73-137-40.compute-1.amazonaws.com
cli53 rrdelete simple.org hostname
Run Code Online (Sandbox Code Playgroud)

我们使用带有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
Run Code Online (Sandbox Code Playgroud)

自动设置主机名并更新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 
Run Code Online (Sandbox Code Playgroud)

检索实际的公用DNS名称并从实例中获取所需的主机名.主机名使用可自定义的"user-data"传递给实例,我们可以在启动实例时指定.该脚本需要格式化的用户数据

hostname=test2
Run Code Online (Sandbox Code Playgroud)

脚本会

  • 从实例user-data中获取主机名信息
  • 从实例元数据中获取公共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
Run Code Online (Sandbox Code Playgroud)

要让脚本在引导时运行,我们在/etc/rc.local中添加一行,例如

/usr/bin/autohostname.sh
Run Code Online (Sandbox Code Playgroud)

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

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

一旦你使用了测试实例,就可以将它备份为AMI,你可以使用它来创建具有相同autohostnaming功能的其他实例.

HTH