TERRAFORM SERIES: LAB … Working on AWS: Variáveis

HCL é a sigla para HashiCorp Configuration Language. Teoricamente, uma linguagem cuja própria sintaxe foi concebida e estruturada de maneira a servir como uma espécie de base comum compartilhada (na prática, uma camada de configuração) entre o TERRAFORM e seus “irmãos” (demais produtos desenvolvidos pela empresa) Ainda na literatura, alguns autores chamam esse tipo de Domain Specific Language (ou DSL) Seria uma forma de agrupar todas as linguagens criadas por empresas para suas respectivas ferramentas de IaC (Infrastructure as Code) no contexto DevOps … Muito sopa de letrinhas para você? 🙁 Eu sei, eu sei, talvez para facilitar iremos de uns poucos, e ao mesmo tempo, bons exemplos:

AnsibleChefPuppetSaltstack
YAML (Python)RubyPuppetDSLYAML (Python)
Tabela 01. ferramentas e linguagens de configuração

Dito isso, e retomando a HCL, podemos ir além e enxergá-la como um meio-termo da programação, chegando até mesmo ao ponto de afirmar que ela também é uma API. Isso porque ela foi desenhada para ser amigável em ambos os lados: humanos e máquinas. Resumidamente, aqui o estado desejado para uma determinada configuração pode ser obtido através de uma mistura de arquivos criados em sintaxe humana (inspirada por exemplo na UCL, ou Ruby) e arquivos gerados por máquinas (por exemplo, o formato JSON)

Anda logo Victor … Qual é a moral da história de hoje? 😐 Bom, o que quero dizer com tudo isso (na verdade, após tudo isso) é que como em qualquer outra linguagem de programação, a HCL igualmente suporta o uso de variáveis para valores mutáveis, e principalmente imutáveis (as famosas constantes) Poxa, e não poderia ter falado antes não, hein?! Claro que não, vocês já me conhecem bem! 😛

Portanto, sendo assim, vamos ao conteúdo do dia …

>_ DEFININDO UM VALOR PADRÃO

Dando continuidade as boas práticas da aula passada, ou seja, separando cada vez mais as coisas, crie um novo arquivo no VScode chamado vars.tf e adicione o seguinte:

variable "amis" {

    type = "map"

    default = {
        "us-east-1" = "ami-09cce346b3952cce3"
        "us-east-2" = "ami-045137e8d34668746"
    }
  
}

Aqui estamos criando uma variável chamada “AMIs”, do tipo “mapa”, que armazena dados no formato “chave:valor” (como se fosse um arquivo JSON, por exemplo) Por fim, salve e retorne ao main.tf para alterar as seguintes linhas:

resource "aws_instance" "dev5" {
  ami           = var.amis["us-east-2"]
  instance_type = "t2.micro"
  key_name      = "terraform-kali"
  tags = {
    Name = "dev5"
  }
  vpc_security_group_ids = [ "${aws_security_group.ssh-access.id}" ]
}

resource "aws_instance" "dev6" {
  provider      = aws.us-east-1
  ami           = var.amis["us-east-1"]
  instance_type = "t2.micro"
  key_name      = "terraform-kali"
  tags = {
    Name = "dev6"
  }
  vpc_security_group_ids = [ "${aws_security_group.ssh-access-us-east-1.id}" ]
  depends_on = [
    aws_dynamodb_table.HOMOLOG-dynamodb
  ]
}

Dessa forma, não precisamos mais decorar ou digitar sempre o mesmo código referente a “essa” ou “aquela” imagem específica. Basta colocar a chave para que o programa retorne o valor correspondente já definido em vars.tf

Agora sim, hora de testar com terraform plan Lembrando que a saída esperada aqui é a mensagem sem alterações, pois é como se estivéssemos trocando seis por meia dúzia. Ou seja, apenas uma outra maneira de escrever a mesma coisa! (de referenciar as mesmas imagens)

Figura 01. terraform plan
Figura 02. no changes!

>_ DEFININDO UM NOVO TIPO: LISTA

Simplificamos a questão das imagens, então agora faremos o mesmo com os endereços ips, ou melhor, os blocos de acesso (CIDR) que estão liberados atualmente para as máquinas EC2. Por se tratarem de endereços dinâmicos, ou seja, que mudam de tempos em tempos, a cada vez que o provedor de internet mudar seu IP público, você terá dois trabalhos: modificar o arquivo security-groups.tf e também as linhas correspondentes no arquivo principal main.tf (o que convenhamos, não muito inteligente) Sendo assim, acompanhe comigo e repita os passos:

Abra o vars.tf e crie uma nova variável do tipo “lista” chamada “ips_remotos”. Em seguida, simule a necessidade de dois IPs distintos para cada filial ou cidade em que suas equipes estão trabalhando. Parênteses: aqui sugiro que você consulte seu IP vigente em https://www.whatismyip.com/ copie e cole o mesmo duas vezes nas variáveis, mas ao final do último edite o octeto para .XX (isso porque caso escolha um número aleatório, salve e siga em frente, a pessoa que também é cliente da mesma operadora com aquele segundo “inofensivo” IP que digitou terá acesso autorizado às instâncias que assim você definiu … então, depois não reclame … )

variable "ips_remotos" {

    type = list

    default = ["187.19.211.170/32","187.19.211.XX/32"]
  
}

Substitua as referências lá no security-group.tf pela nova variável

resource "aws_security_group" "ssh-access" {
  name        = "ssh-access"
  description = "Allow SSH inbound traffic"
  
  ingress {
    description      = "SSH from VPC"
    from_port        = 22
    to_port          = 22
    protocol         = "tcp"
    cidr_blocks      = var.ips_remotos
    #ipv6_cidr_blocks = [aws_vpc.main.ipv6_cidr_block]
  }

resource "aws_security_group" "ssh-access-us-east-1" {
  provider    = aws.us-east-1
  name        = "ssh-access-us-east-1"
  description = "Allow SSH inbound traffic"
  
  ingress {
    description      = "SSH from VPC"
    from_port        = 22
    to_port          = 22
    protocol         = "tcp"
    cidr_blocks      = var.ips_remotos
    #ipv6_cidr_blocks = [aws_vpc.main.ipv6_cidr_block]
  }

E confira se os novos endereços estarão dentro do planejamento sem nenhum erro terraform plan

Figura 03. fail 🙁 error!

Pequena errata: o TERRAFORM é inteligente o suficiente para reconhecer que um IP de final .XX não é um padrão esperado para blocos de acesso. Portanto, troque o primeiro octeto do 2º ip para atual+1, salve e ao terminar esse laboratório desligue a instância EC2 para não ser “ownado” conforme já explicado anteriormente. Ok?

Figura 04. agora sim 🙂 sucesso!

>_ DEFININDO UM NOVO TIPO: STRING

Somente como um teste rápido, até porque não há tanto segredo quanto a esta. Na verdade, bastante simplória pra ser honesto. Repita comigo:

vars.tf

variable "key_name" {

    default = "terraform-kali"
  
}

main.tf

resource "aws_instance" "dev5" {
  ami           = var.amis["us-east-2"]
  instance_type = "t2.micro"
  key_name      = var.key_name
  tags = {
    Name = "dev5"
  }
  vpc_security_group_ids = [ "${aws_security_group.ssh-access.id}" ]
}
Figura 05. terraform apply
Figura 06. terraform plan

https://raw.githubusercontent.com/vicrlda/terraform-aws/master/vars.tf

https://raw.githubusercontent.com/vicrlda/terraform-aws/master/security-group.tf

https://raw.githubusercontent.com/vicrlda/terraform-aws/master/main.tf

REFERÊNCIAS:

https://www.terraform.io/docs/glossary

https://github.com/hashicorp/hcl

https://www.redhat.com/pt-br/topics/automation/what-is-infrastructure-as-code-iac

https://www.edureka.co/blog/chef-vs-puppet-vs-ansible-vs-saltstack/

Deixe uma resposta

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.