Um Script Criador de Máquinas

No meu Post Anterior, expliquei alguns conceitos básicos para usarmos as ferramentas em Shell para a AWS. Nesse texto, dou umas idéias básicas de como criar um script que cria máquinas dentro do ambiente AWS (VPC/EC2).

Antes de mais nada, já aviso que talvez essa não seja a maneira mais fácil de criar um servidor na AWS, pois pode-se criar um servidor, deixá-lo configurado e gerar uma AMI que seria a base para futuras instalações. O objetivo aqui, é demonstrar o conceito. Você pode decidir posteriormente se é melhor ou não.

Além disso, outro ponto importante é que os comandos AWS shell serão relativamente poucos. O restante é puro Shell Script. No entanto, vale a pena analisarmos alguns trechos importantes, o mesmo, pois a criação e instalação de máquinas possui várias pegadinhas. Como ponto a favor, pode-se adaptar esse script para ambientes non-cloud ou servidores físicos de sua rede interna. Um conceito que passamos a adotar dentro da MATERA.

Inicialmente, vamos descrever nosso ambiente no servidor MASTER, onde ficará o script instalador. Aqui sugerimos alguns arquivos importantes.

  • amazon.defaults: arquivo com diversas definições de variáveis que serão usadas para a criação de máquinas.
  • create-machine.sh: Script de criação do computador na AWS (EC2).
  • install-machine.sh: Chamado pelo script anterior, fica em separado, caso precise ser chamado em separado (em caso de erros na execução do script anterior, ou de parâmetros de uso).
  • stage/ :subdiretório com as pastas e arquivos que serão copiados para o servidor criado. Dentro do mesmo, devem ficar tudo que não for default do servidor E que não seja instalado via RPM/yum. Exemplos são ajustes em arquivos de configuração, usuários que devem existir no servidor, chaves SSH, etc. Cada arquivo/pasta deve seguir a estrutura que estaria no rootdir do servidor a ser criado. ex: stage/etc/passwd, stage/etc/http/conf.d/ssl.conf, etc.
  • stage/tmp/postinstall.sh: Script customizado para seu servidor. Será chamado a partir do servidor criado, para finalizar a instalação do computador.

Bom, primeiramente vamos olhar o conteúdo do arquivo de amazon.defaults do seu ambiente:

# sobreescreve o rootbase 
ROOTBASE=/installers 
# regiao da maquina 
REGION=us-west-2 
# chave de acesso 
KEY=AWS_MASTER 
KEYFILE=$ROOTBASE/$KEY.pem 
# tipo do servidor 
SIZE=m3.medium 
# Security group 
SECURITYGROUPS=sg-fe5718cd 
# AMI a ser usada 
AMI=ami-b5a7ea85 
# Usuario para conexao 
RMTUSER=ec2-user

Note que são apenas definições de variáveis simples. Elas serão chamadas no script propriamente dito através do comando shell source (vulgo .). Vamos analisar partes essenciais de um script assim:

Pegar os parâmetros da linha de comando. O primeiro parâmetro deve ser o arquivo com os defaults do seu ambiente. O segundo será o nome da máquina, no console EC2.

DEFAULTS=$1
source $DEFAULTS
# Nome do servidor na AWS
 TAG=$2
#Arquivo com informacoes do servidor (apos criado)
 INFOFILE=$ROOTBASE/$TAG.info

Criação da máquina propriamente dita. O resultado do comando é jogado no arquivo .info.

#Cria a maquina
ec2-run-instances $AMI -t $SIZE -k $KEY -b $PART --region $REGION $SECGROUP > $INFOFILE
#Verifica qual o ID da instancia
INSTANCIA=`awk 'NR==2{print $2}' $INFOFILE`
#Cria a Tag
ec2-create-tags $INSTANCIA --tag "Name=$TAG"

O ip dinâmico fica arquivado dentro do arquivo .info. Você pode pegar esse dado usando suas ferramentas favoritas de texto (grep, cut, sed, aws, etc).

IP=`cat $INFOFILE|...`

Por fim, rodamos uma conexão para testar (e salvar a chave no known_hosts). Por fim, roda o comando install-machine.sh. Como dito, esse script fica em separado, para que possa ser executado em separado, em caso de problemas. Além disso, note um novo sleep que é usado para aguardar o boot desse servidor.

sleep 300
 # Aguarda um tempo, antes de começar a instalar
 # Faz uma conexao de testes
 $ssh -i $KEYFILE $RMTUSER@$IP id
# Roda o script de configuracao
 $ROOTBASE/install-machine.sh $DEFAULTS $IP

Agora bastar criarmos uma nova máquina:

./create-machine.sh ./amazon.defaults AWS-MATERA-TST1

Continuando, agora veremos detalhes de um script install-machine.sh:

Primeiro deve-se pegar os parâmetros novamente, pois como disse, o script pode ser executado separadamente:

Definimos onde está a estrutura a ser copiada e o arquivo temporário a ser enviado para o servidor.

# Algumas variaveis globais
# Localizacao do stage
STAGEBASE=$ROOTBASE/stage
# Arquivo de stage, sera usado para compactar e copiar o $STAGEBASE
STAGEFILE=/tmp/stage.tgz

Aqui geramos um arquivo .tgz do stage e copiamos o mesmo para o servidor. Após isso abrimos o .tgz lá.

# Faz a copia
cd $STAGEBASE
$tar  cfz $STAGEFILE .
$scp -q -i $KEYFILE $STAGEFILE $RMTUSER@$IP:$STAGEFILE
# abre a imagem
$ssh -t -i $KEYFILE -l $RMTUSER $IP "(cd /;sudo $tar xfz $STAGEFILE)"

Por fim rodamos um outro script, agora dentro do servidor instalado. Esse script está dentro do stage e pode ser customizado de acordo com as necessidades específicas do seu servidor. Na MATERA, cada tipo de servidor (appserver, bdserver, webserver, etc) tem seu próprio script:

# roda o postinstall
 echo -n "Rodar o script de de post-install. ok? [Y] "
 read RUNSCRIPT
 if [ "$RUNSCRIPT" = "y" -o "$RUNSCRIPT" = "Y" -o "$RUNSCRIPT" = "" ]; then
  $ssh -t -i $KEYFILE -l $RMTUSER $IP "sudo /tmp/postinstall.sh"
 fi

Vamos olhar um exemplo de script postinstall.sh.

Primeiramente, atualizamos o servidor com novos pacotes da AWS. Além disso, podemos instalar os pacotes que não vem por default e que nosso servidor possa precisar:

#!/bin/sh
# postinstall.sh: Roda comandos apos a instalacao
yum -y update
yum -y install emacs xinetd rrdtool sysstat

Devemos iniciar os serviços na máquina. Também devemos configurar os mesmos para subirem no boot do servidor, caso o mesmo tenha que ser reiniciado. Ex:

chkconfig --add tomcat
chkconfig tomcat on
chkconfig nrpe on
/etc/rc.d/init.d/xinetd start
/etc/rc.d/init.d/tomcat start

Por fim, não esqueça da limpeza da casa:

rm -f /tmp/stage.tgz
rm -f /tmp/postinstall.sh

Prontinho. Essas são ideias que devem ser lembradas ao se fazer um script nesse sentido.

Por MATIAS SCHWEIZER

Analista de Sistemas Operacionais e Redes, formado na UNICAMP, plastimodelista nas horas vagas e pai em tempo integral.

Postado em: 01 de junho de 2015

Confira outros artigos do nosso blog

Estimando Custos na AWS

08 de março de 2016

Anderson Lima

Usando Amazon SQS como sistema de mensagens (2/2)

02 de março de 2016

Luis Sergio F. Carneiro

Cine Dojo: a mistura da MATERA de Coding Dojo, Cinema, Pipoca e TI!

04 de fevereiro de 2016

Valmir Massafera Jr

Documentação da sua Nuvem com Linha do Comando

15 de dezembro de 2015

Matias Schweizer

Deixe seu comentário