初始化 – 在EC2上使用Ubuntu的ec2-init脚本 – 自动设置主机名并使用Route53注册

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

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

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

提前致谢.

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

使用Route53

这是我做的首先,我使用IAM tools创建一个用户“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记录条目,我使用优秀的python包装库为Route53,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备份它是有意义的,您可以使用它来创建具有相同自动主动能力的其他实例.

HTH

相关文章

目录前言一、创建Hadoop用户二、更新apt和安装Vim编辑器三、...
原文连接:https://www.cnblogs.com/yasmi/p/5192694.html ...
电脑重启后,打开VirtualBox,发现一直用的虚拟机莫名的消失...
参见:https://blog.csdn.net/weixin_38883338/article/deta...
Ubuntu 18.04 LTS 已切换到 Netplan 来配置网络接口。Netpla...
介绍每个 Web 服务都可以通过特定的 URL 在 Internet 上访问...