Guía de inicio rápido para Packer

En esta página, se explica cómo emplear Packer y Cloud Build a fin de crear una imagen de VM para usarla en Google Compute Engine. Si deseas crear una configuración de compilación, debes definir instrucciones para Packer y Cloud Build. Luego usarás la configuración para iniciar una compilación.

Antes de comenzar

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. En GCP Console, en la página de selección de proyecto, selecciona o crea un proyecto de GCP.

    Ir a la página de selección de proyecto

  3. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

  4. Habilita lasCloud BuildAPI.

    Habilita lasAPI

  5. Instala e inicializa el SDK de Cloud.

Accede a Google Cloud Platform

  1. Autoriza a la herramienta de línea de comandos de gcloud para que acceda a tu proyecto.

    gcloud auth login
    
  2. Configura tu proyecto para la herramienta de gcloud de la manera siguiente:

    gcloud config set project [PROJECT_ID]
    

    [PROJECT_ID] es tu ID del proyecto de GCP que creaste o seleccionaste en la sección anterior.

Configura tu proyecto

  1. Realiza una de las acciones siguientes:

    • Si nunca creaste una configuración, consulta la sección sobre gcloud topic configurations.

    • Si ya creaste una configuración, actívala de la manera siguiente:

      gcloud config configurations activate [CONFIGURATION NAME]

  2. Establece la variable del proyecto:

    PROJECT=$(gcloud config get-value project)
    

    Una vez que configuras la variable del proyecto, el comando muestra el resultado siguiente:

    Your active configuration is: [<your-config-name>]
    
  3. Asegúrate de que la variable del proyecto esté configurada correctamente:

    echo $PROJECT
    

Habilita los servicios

Habilita los servicios de la API de Cloud obligatorios para tu proyecto:

gcloud services enable sourcerepo.googleapis.com
gcloud services enable cloudapis.googleapis.com
gcloud services enable compute.googleapis.com
gcloud services enable servicemanagement.googleapis.com
gcloud services enable storage-api.googleapis.com
gcloud services enable cloudbuild.googleapis.com

Configura permisos

  1. Busca la cuenta de servicio de Cloud Build de la manera siguiente:

    CLOUD_BUILD_ACCOUNT=$(gcloud projects get-iam-policy $PROJECT --filter="(bindings.role:roles/cloudbuild.builds.builder)"  --flatten="bindings[].members" --format="value(bindings.members[])")
    
  2. Agrega la función de editor a la cuenta con el comando siguiente:

    gcloud projects add-iam-policy-binding $PROJECT \
      --member $CLOUD_BUILD_ACCOUNT \
      --role roles/editor
    

    Verás el informe de la política de IAM actualizado para tu proyecto.

Crea una imagen de compilador de Packer

Clona el repositorio cloud-builders-community para compilar una imagen con el compilador de imágenes de Packer. Luego, envía la imagen al repositorio del contenedor con los pasos siguientes:

  1. Guarda tu directorio de trabajo:

    project_dir=$(pwd)
    
  2. Navega a tu directorio temporal:

    cd /tmp
    
  3. Clona el repositorio cloud-builders-community:

    git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
    
  4. Navega a la imagen del compilador de Packer:

    cd cloud-builders-community/packer
    
  5. Envía el compilador a tu proyecto:

    gcloud builds submit .
    

    Una vez que finalice la compilación, verás un resultado similar al siguiente:

    DONE
    --------------------------------------------------------------------------------
    
    ID                                    CREATE_TIME                DURATION  SOURCE                                                                                         IMAGES                                       STATUS
    e3d89cdd-924c-4539-bc9d-2c87e0e910e5  2019-06-14T19:06:44+00:00  1M11S     gs://[PROJECT_ID]_cloudbuild/source/1560539203.19-1d492a75515340f1bc92c0a8a6937308.tgz  gcr.io/[PROJECT_ID]/packer (+2 more)  SUCCESS
    

    También puedes ver la compilación en la página Cloud Build en Google Cloud Platform Console.

    Abrir la página Cloud Build

    Verás la página del historial de compilaciones con detalles de tu compilación:

    Captura de pantalla de la imagen de compilación de Packer

  6. Quita el repositorio de tu directorio temporal:

    rm -rf /tmp/cloud-builders-community
    
  7. Regresa a $project_dir:

    cd $project_dir
    

Prepara los archivos fuente

Necesitarás algún código fuente de muestra para compilar. En esta sección, crearás un ejemplo sencillo de Hello World con el compilador de Packer.

  1. Crea un directorio llamado hello-world y navega hasta él:

    mkdir hello-world
    cd hello-world
    
  2. Crea un archivo llamado cloudbuild.yaml con el contenido siguiente:

    steps:
    - name: 'gcr.io/$PROJECT_ID/packer'
      args:
      - build
      - -var
      - image_name=$_IMAGE_NAME
      - -var
      - project_id=$PROJECT_ID
      - -var
      - image_family=$_IMAGE_FAMILY
      - -var
      - image_zone=$_IMAGE_ZONE
      - packer.json
    
  3. Crea un archivo llamado install-website.sh con el contenido siguiente:

    #!/bin/sh
    sudo yum install -y epel-release
    sudo yum install -y nginx
    sudo chkconfig nginx on
    LOCATION_OF_INDEX=/usr/share/nginx/html/index.html
    sudo bash -c "cat <<A_VERY_SPECIAL_MESSAGE>$LOCATION_OF_INDEX
    <html>
    <h2> Hello World! </h2>
    </html>
    
    A_VERY_SPECIAL_MESSAGE
    "
    
  4. Crea un archivo llamado packer.json con el contenido siguiente.

    {
        "variables": {
            "image_name": "",
            "image_family": "",
            "image_zone": "",
            "project_id": ""
        },
    
        "builders": [
            {
                "image_name": "{{ user `image_name` }}",
                "type": "googlecompute",
                "project_id": "{{ user `project_id`}}",
                "source_image_family": "centos-7",
                "image_family": "{{ user `image_family` }}",
                "ssh_username": "packer",
                "zone": "{{ user `image_zone` }}",
                "startup_script_file": "install-website.sh",
                "scopes": [
                    "https://www.googleapis.com/auth/userinfo.email",
                    "https://www.googleapis.com/auth/compute",
                    "https://www.googleapis.com/auth/devstorage.full_control"
                ]
            }
        ]
    }
    

    Ahora tienes los archivos siguientes en tu directorio hello-world: cloudbuild.yaml, install-website.sh y packer.json.

  5. Verifica la compilación:

    gcloud builds submit --substitutions=_IMAGE_NAME="hello-v1",_IMAGE_FAMILY="hello-world",_IMAGE_ZONE="us-east1-b"
    

    Una vez que finalice la compilación, verás un resultado similar al siguiente:

    DONE
    --------------------------------------------------------------------------------
    
    ID                                    CREATE_TIME                DURATION  SOURCE                                                                                         IMAGES  STATUS
    9a279714-e908-4033-9b46-25f8753e2cdc  2019-06-14T19:43:49+00:00  5M35S     gs://[PROJECT_ID]_cloudbuild/source/1560541428.62-64d0dc6fb01648d1be6fae9e045f6093.tgz  -       SUCCESS
    

Modifica la imagen

  1. Abre install-website.sh.

  2. En la etiqueta <h2>, cambia "Hello World" por "Hello Universe":

    #!/bin/sh
    sudo yum install -y epel-release
    sudo yum install -y nginx
    sudo chkconfig nginx on
    LOCATION_OF_INDEX=/usr/share/nginx/html/index.html
    sudo bash -c "cat <<A_VERY_SPECIAL_MESSAGE>$LOCATION_OF_INDEX
    <html>
    <h2> Hello Universe! </h2>
    </html>
    
    A_VERY_SPECIAL_MESSAGE
    "
    
  3. Verifica la compilación con el nombre de la imagen nueva:

    gcloud builds submit --substitutions=_IMAGE_NAME="hello-v2",_IMAGE_FAMILY="hello-world",_IMAGE_ZONE="us-east1-b"
    

    Una vez que finalice la compilación, verás un resultado similar al siguiente:

    DONE
    --------------------------------------------------------------------------------
    
    ID                                    CREATE_TIME                DURATION  SOURCE                                                                                         IMAGES  STATUS
    7787c289-cb07-4e14-91f0-c74055b527a0  2019-06-14T19:57:11+00:00  4M56S     gs://[PROJECT_ID]_cloudbuild/source/1560542231.04-89ff301824a348be9c524a90124488ff.tgz  -       SUCCESS
    
  4. Abre la página de imágenes en Google Cloud Platform Console para ver ambas imágenes.

    Ir a la página Imágenes

    Captura de pantalla de la familia de imágenes de Packer

Realiza una limpieza

Sigue estos pasos para evitar que se generen cargos en tu cuenta de GCP por los recursos que usaste en esta guía de inicio rápido:

  1. Borra la imagen de Packer:

    gcloud container images delete --quiet gcr.io/$PROJECT/packer  --force-delete-tags
    
  2. Borra las imágenes de hello-world:

    gcloud compute images delete --quiet hello-v1 hello-v2
    

Pasos siguientes