Como criar imagens de VM usando o Packer

O Packer é uma ferramenta de código aberto para criar imagens de máquinas virtuais (VMs, na sigla em inglês) idênticas para várias plataformas a partir de uma única configuração de origem. Nesta página, explicamos como usar o Packer e o Cloud Build para criar uma imagem de VM para uso no Compute Engine.

Antes de começar

Nas instruções desta página, pressupomos que você está familiarizado com Packer. Além disso:

  • Tenha em mãos seu código-fonte, incluindo o modelo do Packer.
  • Tenha um repositório do Docker no Artifact Registry ou crie um novo repositório.
  • Se você quiser usar os gcloud comandos nesta página, instale a Google Cloud CLI.
  • Ative as APIs a seguir:

    gcloud services enable compute.googleapis.com
    gcloud services enable servicemanagement.googleapis.com
    gcloud services enable storage-api.googleapis.com
    gcloud services enable artifactregistry.googleapis.com
    

Permissões do IAM obrigatórias

Como criar uma imagem do builder do Packer

O Cloud Build oferece uma imagem do builder da comunidade do Packer que pode ser usada para invocar packer comandos no Cloud Build. Antes de usar esse builder em um arquivo de configuração do Cloud Build, é necessário criar a imagem e enviá-la para o Artifact Registry:

  1. Clone o repositório cloud-builders-community:

    git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
    
  2. Acesse a imagem do criador do Packer:

    cd cloud-builders-community/packer
    
  3. Envie o builder para seu projeto:

    gcloud builds submit . --config cloudbuild.yaml --substitutions=_AR_HOST=[LOCATION]-docker.pkg.dev,_AR_REPO=[REPOSITORY]
    

    Em que:

    • [LOCATION] é a região do repositório do Artifact Registry.
    • [REPOSITORY] é o nome do repositório do Artifact Registry.

Como criar um modelo do Packer

Crie um novo arquivo chamado packer.pkr.hcl e adicione a configuração do modelo.

O exemplo a seguir mostra um modelo do Packer (packer.pkr.hcl) configurado para criar uma imagem de VM do Compute Engine:

packer {
  required_plugins {
    googlecompute = {
      version = ">= 1.1.1"
      source  = "github.com/hashicorp/googlecompute"
    }
  }
}

variable "image_name" {
  type    = string
  description = "The name of the output VM image"
  default = "my-packer-image"
}
variable "project_id" {
  type    = string
  description = "The GCP project ID"
}
variable "image_family" {
  type    = string
  description = "The family of the output VM image"
  default = "my-image-family"
}
variable "image_zone" {
  type    = string
  description = "The zone to build the image in"
  default = "us-central1-a"
}

source "googlecompute" "gce" {
  project_id          = var.project_id
  source_image_family = "ubuntu-2004-lts"
  source_image_project_ids = ["ubuntu-os-cloud"]
  zone                = var.image_zone
  ssh_username        = "packer"
  machine_type        = "e2-small"
  image_name          = "${var.image_name}-"
  image_family        = var.image_family
}

build {
  name    = "gce-vm-image"
  sources = ["sources.googlecompute.gce"]

  provisioner "shell" {
    inline = [
      "echo 'Provisioning image...'",
      "sudo apt-get update",
      "sudo apt-get install -y nginx"
    ]
  }
}

Como usar o builder do Packer

  1. Verifique se o seu modelo do Packer (por exemplo, packer.pkr.hcl) está junto com o código-fonte.

  2. No diretório raiz do projeto, crie um arquivo de configuração da compilação com o nome cloudbuild.yaml ou cloudbuild.json.

  3. No arquivo de configuração de build, adicione uma etapa de build para invocar o comando packer build:

    YAML

    steps:
    - name: '[LOCATION]-docker.pkg.dev/[PROJECT_ID]/[REPOSITORY]/packer'
      args:
      - build
      - -var
      - image_name=[IMAGE_NAME]
      - -var
      - project_id=[PROJECT_ID]
      - -var
      - image_family=[IMAGE_FAMILY]
      - -var
      - image_zone=[IMAGE_ZONE]
      - packer.pkr.hcl
    

    JSON

    {
      "steps": [
       {
          "name": "[LOCATION]-docker.pkg.dev/[PROJECT_ID]/[REPOSITORY]/packer",
          "args": [
            "build",
            "-var",
            "image_name=[IMAGE_NAME]",
            "-var",
            "project_id=[PROJECT_ID]",
            "-var",
            "image_family=[IMAGE_FAMILY]",
            "-var",
            "image_zone=[IMAGE_ZONE]",
            "packer.pkr.hcl"
           ]
        }
       ]
    }
    

    Em que:

    • [LOCATION] é a região do repositório do Artifact Registry.
    • [PROJECT_ID] é o ID do seu Google Cloud projeto.
    • [REPOSITORY] é o nome do repositório do Artifact Registry.
    • [IMAGE_NAME] é o nome da imagem de VM que você está criando.
    • [IMAGE_FAMILY] é a família de imagens da imagem da VM.
    • [IMAGE_ZONE] é a zona de imagem.
  4. Inicie a criação usando o arquivo de configuração de build:

    gcloud builds submit --region=[REGION] --config [CONFIG_FILE_PATH] [SOURCE_DIRECTORY]
    

    Em que:

    • [CONFIG_FILE_PATH] é o caminho para o arquivo de configuração da compilação;
    • [SOURCE_DIRECTORY] é o caminho ou o URL do código-fonte.
    • [REGION] é uma das regiões de build com suporte.

    Se você não especificar [CONFIG_FILE_PATH] e [SOURCE_DIRECTORY] no comando gcloud builds submit, o Cloud Build presumirá que o arquivo de configuração e o código-fonte estão no diretório de trabalho atual.

Depois que as imagens forem criadas, será possível visualizá-las na página Imagem do Compute Engine no Google Cloud console.

A seguir