Automatize tudo: Terraform + Ansible + Elastic Cloud Enterprise
Este post do blog é uma sequência do nosso primeiro post, intitulado Automating the installation of Elastic Cloud Enterprise with Ansible (Automatizar a instalação do Elastic Cloud Enterprise com o Ansible), e mostra como estender a automação ao provisionamento na nuvem com o Terraform. No primeiro post, detalhamos como implantar e configurar o Elastic Cloud Enterprise (ECE) em três zonas de disponibilidade na AWS usando o Ansible. No entanto, o provisionamento das instâncias subjacentes do EC2 e a configuração dos grupos de segurança foram todos feitos manualmente.
Neste post, aprimoraremos nossa metodologia usando o Terraform para automatizar o provisionamento e a configuração dessas instâncias do EC2 e dos grupos de segurança. Também vamos usá-lo para automatizar a instalação, a configuração e a execução do manual do Ansible que criamos da última vez. A automação é boa.
A propósito, o que é o Terraform? Não tem nada a ver com o dispositivo Genesis como eu pensava inicialmente. De acordo com a HashiCorp (os desenvolvedores), trata-se de uma ferramenta para desenvolvimento, alteração e controle de versão da infraestrutura usando configuração de alto nível: infraestrutura como código. Isso é útil por vários motivos, entre os quais o fato de que tudo o que é necessário para montar, executar e configurar a sua infraestrutura reside em arquivos de texto que podem ter controle de versão e ser CRUDados (nossa, inventei uma palavra!) programaticamente.
Embora o foco deste post seja a AWS como provedor de serviços em nuvem, você pode usar o Terraform para provisionar e gerenciar recursos em qualquer provedor. Confira a lista dos maiores provedores de serviços em nuvem deles e a lista dos provedores de escala (aparentemente) um pouco menor. Um exemplo usando o GCP está disponível no nosso repositório de exemplos no GitHub.
E, por fim, como antes, este post do blog é uma demonstração básica que criará um ambiente do ECE adequado para uma pequena prova de conceito ou ambiente de desenvolvimento. Uma implantação de produção completa deve usar grupos de instâncias, balanceadores de carga e outras construções de alta disponibilidade que foram deixadas de fora desta configuração. Consulte os documentos de planejamento do Elastic Cloud Enterprise para ver detalhes adicionais sobre planejamento e implantação para produção.
Vamos começar?
Tarefas
Mais uma vez, vamos seguir o exemplo de pequena instalação de linha de base da documentação do ECE, mas nossas tarefas são bem diferentes:
- Instalar o Terraform
- Definir a infraestrutura
- Executá-lo
- Tadaaa!!!
Instalar o Terraform
A documentação da HashiCorp é ideal para isso. Você também precisará do Ansible, que instalamos no primeiro post do blog. Se ainda não fez isso, consulte os a documentação do Ansible. No meu caso, como eu uso um Macbook Pro, digitei o seguinte:
> brew install terraform > brew install ansible
É importante observar que a configuração que usei é compatível com o Terraform versão 0.12. Eu usei especificamente a versão 0.12.19.
Definir a infraestrutura
As etapas nesta tarefa são:
- Inicializar a sua configuração do Terraform com aquelas que eu usei.
- Navegar por elas para ter uma noção do que está acontecendo.
- Definir algumas variáveis que esperamos que sejam exclusivas para você.
Inicializar a sua configuração do Terraform
Como foi dito anteriormente, o Terraform é uma maneira de provisionar a infraestrutura por meio de arquivos de configuração. Portanto, existem muitos arquivos de configuração. Para avançar mais rapidamente, clone o repositório ou baixe os arquivos do nosso repositório de exemplos no GitHub. Tudo o que vamos fazer é feito nesses arquivos.
Como antes, minhas etapas são adaptadas para pessoas inclinadas a trabalhar com a interface de linha de comando como eu, pois é muito mais difícil escrever instruções de apontar e clicar!
Etapas
- Clone ou baixe do repositório de exemplos.
> git clone https://github.com/elastic/examples.git
- Navegue até onde você salvou o arquivo.
> cd /workspace/github/elastic/examples
- Navegue até os exemplos do Terraform na AWS com ECE.
> cd Cloud\ Enterprise/Getting\ Started\ Examples/aws/terraform
- Prepare-se para fazer um pouco de edição de texto.
Navegar pelos arquivos
Você deverá ter os arquivos a seguir à sua frente. Navegue por eles se quiser.
terraform.tfvars.example | Depois de renomear para terraform.tfvars , esse é o principal local onde definimos nossas coisas secretas e substituímos qualquer variável em variables.tf que desejamos.
|
variables.tf | Grupos de variáveis; provavelmente seria bom você dar uma olhada nisso. |
provider.tf | Configuração do Terraform para dizer a ele como se conectar à AWS. |
servers.tf | Configuração do Terraform para encontrar a nossa AMI desejada, implantar nossas instâncias e capturar os metadados das instâncias para uso pelo Ansible. |
networking.tf | Configuração do Terraform que faz várias configurações de rede da AWS: uma VPC, um gateway da internet, uma tabela de roteamento, uma sub-rede e grupos de segurança. |
main.tf | Configuração do Terraform que executa o script do Ansible e coleta algumas de suas saídas mais importantes. |
ansible-install.sh | O Terraform do script modificará e chamará para configurar e executar o Ansible com a função do ECE. |
Definir variáveis
Precisamos definir algumas variáveis diferentes para que isso funcione para você (porque eu já fiz funcionar para mim e agora o negócio é com você).
- Um nome de projeto que será marcado em todos os recursos da AWS que forem criados
- Seu IP para que somente você tenha acesso SSH às instâncias subjacentes; definir como
0.0.0.0/0
também funcionaria se você quisesse abri-lo para o mundo - Credenciais de acesso da AWS para permitir que o Terraform provisione coisas
Se você não tem um par de chaves secretas/de acesso da AWS, siga a documentação da AWS para criar um.
Observação: variables.tf
define um local de arquivos de chave pública e privada a ser usado para acesso seguro (por SSH) nas instâncias do EC2. Se você não tem uma chave de SSH, sugiro que você pesquise no Google. A DigitalOcean tem uma boa descrição básica para Linux/OSX e Windows.
Etapas
- Renomeie
terraform.tfvars.example
comoterraform.tfvars
. - Em
terraform.tfvars
, faça as seguintes alterações:- Defina um
project_name
usado para identificar todos os seus recursos da AWS. - Defina
trust_network
como seu IP na notação CIDR ou no intervalo que você preferir. - Defina
aws_access_key
eaws_secret_key
com suas informações. - Opcionalmente, substitua
aws_region
,public_key
e/ouprivate_key
.
- Defina um
Duas configurações que não estou pedindo para você alterar são as configurações da AMI e do tipo de instância do EC2. Existem algumas razões para isso, mas o objetivo é principalmente reduzir a complexidade ao iniciar. Como na última vez, nosso plano é implantar três instâncias i3.xlarge a partir de uma AMI CentOS 7.
- Para garantir que o Terraform encontre a AMI correta, podemos fornecer vários metadados. Nesse caso, usei um padrão de nome, uma ID de proprietário (centos.org) e um tipo de virtualização. O padrão de nome e a ID do proprietário são configuráveis em
variables.tf
, mas esteja ciente de que, se selecionar uma AMI diferente (por exemplo, uma com Ubuntu), você poderá precisar de um valor diferente pararemote_user
. - A alteração do tipo de instância também tem ramificações. As instâncias i3 usam unidades NVMe conectadas localmente que têm um nome de dispositivo OS e definições de configuração específicos no Terraform. Se você usar uma instância diferente e anexar volumes do EBS, precisará alterar
servers.tf
para mapeá-la corretamente. Consulte a documentação do Terraform para obter mais informações.
As configurações que usei para a AMI e o tipo de instância do EC2 podem ser vistas em variables.tf
.
# O nome da AMI no AWS Marketplace variable "aws_ami_name" { default = "CentOS Linux 7 x86_64 HVM*" } # O proprietário da AMI variable "aws_ami_owner" { default = "679593333241" # centos.org } # O usuário para fazer login nas instâncias e executar a instalação # Isso depende da AMI usada; portanto, verifique se elas estão sincronizadas. Por exemplo, uma AMI do Ubuntu utilizaria o usuário ubuntu variable "remote_user" { default = "centos" } # Tipo de instância do ECE variable "aws_instance_type" { default = "i3.xlarge" } # O nome do dispositivo do volume não raiz que será usado pelo ECE # Para instâncias i3, é nvme0n1. # Se você usar um tipo de instância diferente, esse valor mudará e também poderá exigir alterações na definição do recurso em servers.tf variable "device_name" { default="nvme0n1" }
Executá-lo
Está praticamente pronto. Muito louco, né? É possível que, se simplesmente prosseguisse com os padrões e não passasse muito tempo investigando todos os arquivos de configuração, neste ponto, você tivesse acabado de instalar o Terraform, copiado alguns arquivos e definido algumas variáveis. E depois? Depois é só executar o negócio!
Etapas
- Inicialize o Terraform.
> terraform init
- Aplique as configurações que trabalhamos tanto para construir.
> terraform apply
Sim. É isso aí!
Depois de alguns minutos, você deverá obter uma saída como a mostrada abaixo, que informa a URL e a senha do administrador do console de administração do ECE:
null_resource.run-ansible (local-exec): TASK [ansible-elastic-cloud-enterprise : debug] ******************************** null_resource.run-ansible (local-exec): ok: [ec2-52-70-7-3.compute-1.amazonaws.com] => { null_resource.run-ansible (local-exec): "msg": "Adminconsole is reachable at: https://ec2-35-175-235-131.compute-1.amazonaws.com:12443" null_resource.run-ansible (local-exec): } null_resource.run-ansible (local-exec): TASK [ansible-elastic-cloud-enterprise : debug] ******************************** null_resource.run-ansible (local-exec): ok: [ec2-52-70-7-3.compute-1.amazonaws.com] => { null_resource.run-ansible (local-exec): "msg": "Adminconsole password is: yI6ClXYNQ5LGiZlBuOm94s8hGV5ispQS24WVfL5fE9q" null_resource.run-ansible (local-exec): } null_resource.run-ansible (local-exec): TASK [ansible-elastic-cloud-enterprise : include_tasks] ************************ null_resource.run-ansible (local-exec): skipping: [ec2-52-70-7-3.compute-1.amazonaws.com] null_resource.run-ansible (local-exec): PLAY RECAP ********************************************************************* null_resource.run-ansible (local-exec): ec2-34-229-205-85.compute-1.amazonaws.com : ok=68 changed=37 unreachable=0 failed=0 skipped=7 rescued=0 ignored=1 null_resource.run-ansible (local-exec): ec2-35-175-235-131.compute-1.amazonaws.com : ok=68 changed=29 unreachable=0 failed=0 skipped=8 rescued=0 ignored=1 null_resource.run-ansible (local-exec): ec2-52-70-7-3.compute-1.amazonaws.com : ok=68 changed=37 unreachable=0 failed=0 skipped=7 rescued=0 ignored=1 null_resource.run-ansible: Creation complete after 16m50s [id=7701810896203834102] Apply complete! Resources: 1 added, 0 changed, 1 destroyed. Outputs: ece-instances = [ [ "ec2-35-175-235-131.compute-1.amazonaws.com", "ec2-34-229-205-85.compute-1.amazonaws.com", "ec2-52-70-7-3.compute-1.amazonaws.com", ], ] installed-ece-url = https://ec2-35-175-235-131.compute-1.amazonaws.com:12443
Incentivo você a abri-lo e brincar um pouco com ele. Não tenha medo! Se você fizer alguma besteira, poderá simplesmente destruir tudo e recriar da seguinte forma:
> terraform destroy > terraform apply
Observação: os certificados usados para TLS são autoassinados; portanto, você receberá um aviso no navegador quando tentar acessar o console de administração. Você poderá configurar o ECE para usar os seus próprios certificados. Leia mais sobre isso na documentação.
Tadaaa!!!
Espero que você concorde que o nível de esforço desta vez foi substancialmente menor do que da última vez. Conseguimos evitar totalmente o console da AWS e as cerca de 38 etapas que usamos para que todos os recursos fossem implantados, configurados e protegidos (este novo método tem 10 etapas pelas minhas contas).
Agora vá em frente e explore, pois a nuvem é pequena e você é um gigante! Brinque com o ECE, inicialize os clusters, atualize-os e redimensione-os. Desfrute da facilidade e da simplicidade.