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?

Tudo pronto para começar?

Descubra o que sua equipe pode fazer com uma plataforma DevSecOps unificada.