2011-03-03 8 views
12

Me gustaría poder usar los scripts de ec2-init para hacer algunas tareas domésticas cuando hago girar una instancia. Idealmente, me gustaría poder pasar datos de usuario para establecer el nombre de host y ejecutar un par de scripts de inicialización (para configurar el títere, etc.).Usar scripts de ec2-init con Ubuntu en EC2 - Establecer nombre de host automáticamente y registrarse en Route53

Veo un script llamado ec2-set-hostname pero no estoy seguro si puede usarlo para establecer un nombre de host arbitrario a partir de datos de usuario o cuál debería ser el formato de los datos de usuario.

¿Alguien usó estos scripts y sabe cómo puede establecer el nombre de host y ejecutar algunos scripts al mismo tiempo?

Gracias de antemano.

Respuesta

15

Al final decidí omitir las secuencias de comandos ubuntu ec2 y hacer algo similar. Intenté usar el servicio Route53 de Amazon como el servicio de nombres y fue muy fácil ponerlo en funcionamiento.

Usando Route53

Esto es lo que hice; En primer lugar he usado el IAM tools para crear un usuario route53 'con permisos para políticas liberales para interactuar con el servicio de Route53

Crear el grupo DNS & usuario

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

crear claves para el usuario y tome en cuenta estos para más adelante

iam-useraddkey -u route53 

dan acceso al grupo para añadir zonas y registros DNS

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

una lista de los usuarios y políticas para un grupo

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

Para añadir y eliminar entradas de registro DNS que utiliza la excelente biblioteca de Python envoltura para Route53, cli53. Esto elimina el dolor de usar route53. Puede tomar desde aquí

https://github.com/barnybug/cli53

En mi caso, el script en Python es un enlace simbólico en/usr/bin como cli53. Tendrá que establecer las siguientes variables de entorno que contienen claves creadas anteriormente para el usuario de route53.

export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXXX 

Deberá entonces crear una entrada de zona para su dominio, p. simple.org

cli53.py create simple.org 

Esto debería devolver una dirección del servidor de nombres del Amazonas que se puede asociar con su nombre de dominio a través de su nombre de dominio de registro, de modo que las búsquedas por nombre de dominio serán redirigidos a los servidores Route53.

Una vez que la zona está configurada, agregar y eliminar entradas es simple, p.

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

se utiliza una entrada CNAME con el nombre DNS público de la instancia EC2 ya que esto va a resolver el nombre de host a la dirección IP pública externa y la IP privada desde dentro de EC2. A continuación, se agrega una entrada para un host 'test2.simple.org'.

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

Se ajusta automáticamente el nombre de host y la actualización de Route53

Ahora lo que queda es configurar un script para hacer esto automáticamente cuando la máquina arranca. Esta solución y la siguiente secuencia de comandos le debe a la enorme deuda excelente tutorial de Marius Ducea encontrar aquí

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

Se trata básicamente de hacer lo mismo que la configuración de Marius, pero utilizando en lugar de Route53 Enlazar.

La secuencia de comandos utiliza los servicios basados ​​en REST simples disponibles para cada instancia de EC2 en

http://169.254.169.254 

para recuperar el nombre DNS público real y agarrar el nombre de host que desee de la instancia. El nombre de host se pasa a la instancia utilizando los 'datos de usuario' personalizables que podemos especificar cuando comenzamos la instancia. El script espera datos de usuario en el formato

hostname=test2 

el guión

  • información agarrar nombre de host a partir de los datos de usuario de instancia
  • agarrar el nombre DNS público de la instancia de metadatos
  • de análisis el nombre de host
  • establece el nombre de host en el nombre completo, por ejemplo test2.simple.org,
  • Agregue un registro CNAME para este FQDN en el punto Route53 al nombre DNS público
  • escriba una entrada en los mensajes del día para que los usuarios puedan ver el dominio en la asignación ec2 cuando inicien sesión

copiar y guardar los siguientes como /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 

para obtener la secuencia de comandos para ejecutar en el arranque, añadimos una línea en /etc/rc.local por ejemplo,

/usr/bin/autohostname.sh 

Cambie los datos de usuario para la instancia de prueba a 'hostname = test2' y reinicie la instancia. Una vez que se reinicie, debe poder iniciar sesión a través de test2.simple.org. Puede tardar unos minutos en resolverse correctamente, según los TTL que haya especificado. Cuando inicie sesión, debería ver un mensaje MOTD que le dice

La instancia se ha registrado con los servidores de nombres Route53 como 'test2.simple.org' apuntando al nombre de dominio ec2 'ec2-184-73-137-40.compute- 1.amazonaws.com '

Una vez que tenga esto trabajando con la instancia de prueba, tendría sentido realizar una copia de seguridad como una AMI que puede usar para crear otras instancias con las mismas capacidades de autohostnaming.

HTH

+1

Great answer. Esto me puso en marcha bastante rápido. Hice un cambio. En lugar de usar los 'datos de usuario' construí el nombre de host de las etiquetas ec2: HOSTNAME = $ (ec2-describe-tags --filter resource-type = instancia --filter resource-id = "$ INSTANCE_ID" | fgrep Nombre | corte -f5) – dkantowitz

2

He instalado la gema route53, y escribió un pequeño script:

joya instalar 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 

-Josh

0

que he tomado un enfoque similar a ' sgargan 'que permite a una instancia crear su propio registro DNS en la Ruta 53, pero en su lugar he usado la biblioteca phython AWS' boto 'y he configurado' systemd '(los init/ups) reemplazo de tarta lanzado en Fedora 15/16) para eliminar la entrada dns cuando el host se apaga.

Por favor, vea el siguiente recorrido sobre la forma de hacerlo: -

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

Si bien no es ideal exponer sus direcciones IP internas en un archivo de zona DNS externo, hasta el momento en que Amazon crear un servicio DNS interno, entonces creo que es preferible ejecutar sus propias instancias BIND.

Cuestiones relacionadas