Topics Gitops Como as equipes usam o GitLab e o Terraform para implantar infraestrutura como código: uma demonstração

Como as equipes usam o GitLab e o Terraform para implantar infraestrutura como código: uma demonstração


Esta demonstração apresenta as boas práticas de GitOps para implantar infraestrutura como código, usando o Terraform para automação e o GitLab como a fonte única de verdade.

Usar um repositório Git como a fonte única de verdade para todo o código de infraestrutura e implantação de aplicações, com várias equipes trabalhando juntas, é uma boa prática de GitOps. As equipes de infraestrutura podem colaborar e implantar código em vários serviços de nuvem usando o Terraform para automação. Este artigo demonstra como as equipes podem criar um cluster do Kubernetes colaborando com colegas de equipe no GitLab.

Saiba como o GitLab permite implantar a infraestrutura como código

Confira nesta demonstração como seguir boas práticas de GitOps para implantar infraestrutura como código, usando o Terraform para automação e o GitLab como a fonte única de verdade, bem como para CI.

Criação da infraestrutura como código no GitLab

Primeiros passos

Este grupo gitops-demo ilustra as etapas que as equipes de infraestrutura podem seguir.

Comece fazendo login no grupo que hospeda o projeto no GitLab. A próxima etapa é abrir o arquivo README.md, que mostra a estrutura subjacente do grupo gitops-demo. Existem alguns projetos individuais e dois subgrupos: infraestrutura e aplicações.

Dentro do subgrupo de infraestrutura

Há um repositório separado para cada nuvem: Azure, GCP e AWS, além de um repositório para modelos.
Arquivos semelhantes podem ser encontrados em todos os três repositórios de nuvem. Todos os arquivos são escritos no Terraform para automatizar o processo de implantação, enquanto um arquivo gitlab-ci.yml também é armazenado no repositório para definir as instruções de automação.

O arquivo de back-end

Usar o [Terraform Cloud Service] da HashiCorp (https://www.hashicorp.com/blog/announcing-terraform-cloud) como local remoto para o arquivo de estado mantém o arquivo seguro e centralizado, permitindo que ele seja acessado por qualquer processo. Uma vantagem de usar o Terraform Cloud é que ele possibilita bloquear o estado para garantir que apenas um job possa ser executado por vez e evitar que vários jobs façam alterações conflitantes. O código armazena os arquivos de estado no Terraform Cloud em uma organização chamada gitops-demo, em um espaço de trabalho chamado aws. Isso mantém o estado de execução no provedor de nuvem para que qualquer membro da equipe tenha acesso a qualquer momento.

terraform {
  backend "remote" {
    hostname     = "app.terraform.io"
    organization = "gitops-demo"
    workspaces {
      name = "aws"
    }
  }
}

EKS.tf file

O EKS é outro arquivo Terraform que usa o módulo EKS para o cluster Terraform. As equipes podem definir parâmetros, como o tipo de sub-rede e o número de nós, no arquivo EKS do Terraform.

module "eks" {
  source           = "terraform-aws-modules/eks/aws"
  cluster_name     = "gitops-demo-eks"
  subnets          = "${module.vpc.public_subnets}"
  write_kubeconfig = "false"
  tags = {
    Terraform   = "true"
    Environment = "dev"
  }
  vpc_id = "${module.vpc.vpc_id}"
  worker_groups = [
    {
      instance_type = "m4.large"
      asg_max_size  = 5
      tags = [{
        key                 = "Terraform"
        value               = "true"
        propagate_at_launch = true
      }]
    }
  ]
}

Definir o administrador do GitLab

O provedor do Kubernetes pode ser usado para criar um usuário administrador do GitLab e configurar tudo automaticamente como código, gerenciado pelo Terraform.

Registrar o cluster com o GitLab

Agora que um cluster do Kubernetes foi criado, é hora de registrá-lo no GitLab para implantar mais código no cluster no futuro. A primeira etapa é usar o provedor do GitLab para criar um cluster de grupos chamado AWS cluster.

data "gitlab_group" "gitops-demo-apps" {
  full_path = "gitops-demo/apps"
}
provider "gitlab" {
  alias   = "use-pre-release-plugin"
  version = "v2.99.0"
}
resource "gitlab_group_cluster" "aws_cluster" {
  provider           = "gitlab.use-pre-release-plugin"
  group              = "${data.gitlab_group.gitops-demo-apps.id}"
  name               = "${module.eks.cluster_id}"
  domain             = "eks.gitops-demo.com"
  environment_scope  = "eks/*"
  kubernetes_api_url = "${module.eks.cluster_endpoint}"
  kubernetes_token   = "${data.kubernetes_secret.gitlab-admin-token.data.token}"
  kubernetes_ca_cert = "${trimspace(base64decode(module.eks.cluster_certificate_authority_data))}"
}

O código contém o nome do domínio, escopo do ambiente, e credenciais Kubernetes.

Depois que isso for executado, o cluster será criado na AWS e registrado automaticamente no grupo gitops-demo/apps.

Implantação do código usando o GitLab CI

Modelo do Terraform

Retorne ao grupo de infraestrutura e abra a pasta Modelos. Ao analisar o arquivo terraform.gitlab-ci.yml, é possível conferir como a CI funciona para implantar o código da infraestrutura na nuvem usando o Terraform.

Dentro do arquivo de CI, as equipes podem conferir algumas etapas diferentes: validar, planejar, aplicar e destruir. Ao utilizar a imagem base do Terraform da Hashicorp, os usuários podem executar diferentes tarefas.

A primeira etapa é inicializar o Terraform.

before_script:
  - terraform --version
  - terraform init
  - apk add --update curl
  - curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.13.7/2019-06-11/bin/linux/amd64/kubectl
  - install kubectl /usr/local/bin/ && rm kubectl
  - curl -o aws-iam-authenticator https://amazon-eks.s3-us-west-2.amazonaws.com/1.13.7/2019-06-11/bin/linux/amd64/aws-iam-authenticator
  - install aws-iam-authenticator /usr/local/bin/ && rm aws-iam-authenticator

A próxima etapa é validar se tudo está correto.

validate:
  stage: validate
  script:
    - terraform validate
    - terraform fmt -check=true
  only:
    - branches

É importante lembrar que bons fluxos de trabalho do GitOps incorporam a criação de uma solicitação de merge para as alterações.

merge review:
  stage: plan
  script:
    - terraform plan -out=$PLAN
    - echo \`\`\`diff > plan.txt
    - terraform show -no-color ${PLAN} | tee -a plan.txt
    - echo \`\`\` >> plan.txt
    - sed -i -e 's/  +/+/g' plan.txt
    - sed -i -e 's/  ~/~/g' plan.txt
    - sed -i -e 's/  -/-/g' plan.txt
    - MESSAGE=$(cat plan.txt)
    - >-
      curl -X POST -g -H "PRIVATE-TOKEN: ${GITLAB_TOKEN}"
      --data-urlencode "body=${MESSAGE}"
      "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests/${CI_MERGE_REQUEST_IID}/discussions"
  artifacts:
    name: plan
    paths:
      - $PLAN
  only:
    - merge_requests

A solicitação de merge

A solicitação de merge (MR) é a etapa mais importante no GitOps. Este processo consiste em revisar todas as alterações e verificar o impacto delas. A MR também é uma ferramenta de colaboração na qual os membros da equipe podem discutir as alterações e os stakeholders podem aprová-las antes de fazer o merge final no branch principal.

A solicitação de merge define o que acontecerá ao executar a infraestrutura como código. Depois que a MR é criada, o plano Terraform é enviado por upload para ela. Após a revisão e aprovação de todas as alterações, o código poderá ser mesclado no branch principal. Depois que as alterações de código forem mescladas, todas elas serão implantadas no ambiente de produção.

O que é GitOps?

Experimente o GitLab

Descubra o que sua equipe pode fazer com uma única plataforma de distribuição de software.

Faça uma avaliação gratuita
Headshots of three people

Dúvidas? Estamos aqui para ajudar você.

Fale com um especialista