Deploy Cassandra AWS com Ansible

Olá pessoal,

Vou tirar as teias de aranha do blog e escrever sobre deploy semi-automatizado com Terraform e Ansible de um Cassandra na AWS.
Para deploy da infra, vou usar Terraform que é uma excelente ferramenta para isso. Não é o foco aqui, mas se desejarem mais detalhes, só dizer.
Para a instalação do Cassandra usarei o Ansible que também traz uma ótima forma de automatizar nosso trabalho de instalação de pacotes, ajustes no SO, criação de arquivos/diretórios, …

No cenário que vou testar, vou ignorar um pouco o lado AWS e focar no Cassandra.

Então vamos lá, para  se usar o Terraform, vamos precisar de um ACCESS_KEY e SECRET_KEY com permissões para tal.  Porém, sempre vale o alerta de segurança: Nunca os exponha (em blogs, github, …), pois com apenas esses dois segredinhos algum mal intensionado pode subir várias máquinas na sua conta ou destruir o que você já tem. Acredite, isso acontece nas melhores famílias e fica caro essa brincadeira!

Você vai precisar do terraform instalado na sua máquina.

$ terraform --version
Terraform v0.11.10

Para não complicar muito, vou utilizar minha VPC default (e duas subnets públicas), mas também poderíamos com o Terraform subir toda um infra de rede. Em um cenário real, também seria uma boa prática utilizar o Cassandra em subnets privadas e um JumpHost para conseguir acessá-lo.

Para não ficarmos duplicando código, o Terraform nos permite usar módulos, que são análagos a uma função/método em uma linguagem de programação.
Centralizamos o código no módulo e só passamos os parâmetros que desejamos. O código completo está no github e vou pular detalhes.

Desta forma, deixamos flexível a escolha da AMI (imagem), do tipo (size) da instância, a KeyPair (chave SSH), SecurityGroups, a subnet, se devemos ou não associar um IP público e o nome da instância.
Por outro lado, fixamos algumas propriedades do root device.

Aplicando o terraform:

São dois conjuntos de spot instances, um para cada AZ:

Com isso já temos nossas 6 instances em duas AZs. Importante: para meu Ansible, vou utilizar os IPs públicos, pois ele está instalado no meu PC; para o Cassandra, serão utilizados os IPs privados, já que eles vão se conversar internamente, sem passar pela internet.

 

Avançando para o Ansible. Com o arquivo de hosts configurado, basta aplicar o playbook. Lembrando que você precisa conseguir fazer SSH direto para seus hosts.

Com o Cassandra instalado, precisamos startá-lo em todos os nodes. Precisamos iniciar por um seed e fazer sequencial node por node esperando concluir o bootstrap.
Como sou preguiçoso, vou fazer um outro playbook que faça isso por mim. Para cada start, haverá uma pausa de 1 min para que seja concluído o bootstrap.

Após alguns minutos, temos todos os nodes UPs. Perceba que cada AZ corresponde a um Rack, tudo isto tratado automaticamente pelo Ec2Snitch.

Após tudo pronto, basta destruir a brincadeira e desativar sua ACCESS_KEY se não for mais utilizar.

Os ajustes que você precisará fazer caso queira tentar (me chame caso tenha mais problemas) serão:

– Caso tenha problemas com o JDK (atualmente o 191 está disponível para download), precisa trocar a URL para uma correta.

– O arquivo de hosts do Ansible (com os IPs públicos se for a partir do seu PC ou IPs privados se for outra instance AWS)

– Última linha do cassandra.yaml, nos IPs dos seeds (IPs privados)

– Ajustar os parâmetros de acordo com sua conta AWS.

– Incluir um arquivo dse.repo na pasta de templates seguindo as instruções (como vai user/senha, não vou subir no git) –

https://docs.datastax.com/en/dse/5.1/dse-admin/datastax_enterprise/install/installRHELdse.html
[datastax] 
name = DataStax Repo for DataStax Enterprise
baseurl=https://DSA_profile_name:downloads_key@rpm.datastax.com/enterprise
enabled=1
gpgcheck=0

Era isso, queria mostrar e compartilhar uma forma prática e rápida de ser fazer o deploy. Prometi no último DBA BR que iria compartilhar, aí está com alguns meses de atraso. 🙂

 

Github:

https://github.com/abonacin

 

Abraços

Deixe um comentário

O seu endereço de email não será publicado.