我看到一个名为ec2-set-hostname的脚本,但我不知道是否可以使用它从用户数据中设置任意的主机名,或者用户数据的格式需要什么.
任何人都使用这些脚本,知道如何设置主机名并同时运行一些脚本?
提前致谢.
使用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在这里发现的优秀教程有很大的负担
它基本上和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