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