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:

  1. Instalar o Terraform
  2. Definir a infraestrutura
  3. Executá-lo
  4. 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:

  1. Inicializar a sua configuração do Terraform com aquelas que eu usei.
  2. Navegar por elas para ter uma noção do que está acontecendo.
  3. 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
  1. Clone ou baixe do repositório de exemplos.
    > git clone https://github.com/elastic/examples.git
    	
  2. Navegue até onde você salvou o arquivo.
    > cd /workspace/github/elastic/examples
    	
  3. Navegue até os exemplos do Terraform na AWS com ECE.
    > cd Cloud\ Enterprise/Getting\ Started\ Examples/aws/terraform
    	
  4. 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.exampleDepois 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.tfGrupos de variáveis; provavelmente seria bom você dar uma olhada nisso.
provider.tfConfiguração do Terraform para dizer a ele como se conectar à AWS.
servers.tfConfiguraçã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.tfConfiguraçã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.tfConfiguração do Terraform que executa o script do Ansible e coleta algumas de suas saídas mais importantes.
ansible-install.shO 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
  1. Renomeie terraform.tfvars.example como terraform.tfvars.
  2. Em terraform.tfvars, faça as seguintes alterações:
    1. Defina um project_name usado para identificar todos os seus recursos da AWS.
    2. Defina trust_network como seu IP na notação CIDR ou no intervalo que você preferir.
    3. Defina aws_access_key e aws_secret_key com suas informações.
    4. Opcionalmente, substitua aws_region, public_key e/ou private_key.

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 para remote_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
  1. Inicialize o Terraform.
    > terraform init
    	
  2. 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!!!

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.