Usa una secuencia de comandos de inicio en VMs de Linux

Una secuencia de comandos de inicio realiza tareas durante el proceso de inicio de una máquina virtual (VM). En esta página, se proporcionan los pasos que debes seguir para usar secuencias de comandos de inicio en instancias de VM.

Antes de comenzar

Para usar los comandos de la interfaz de línea de comandos (CLI) de gdcloud, asegúrate de haber descargado, instalado y configurado la CLI de gdcloud. Todos los comandos de Distributed Cloud usan la CLI de gdcloud o kubectl y requieren un entorno de sistema operativo (SO).

Obtén la ruta de acceso del archivo kubeconfig

Para ejecutar comandos en el servidor de la API de Management, asegúrate de tener los siguientes recursos:

  1. Accede y genera el archivo kubeconfig para el servidor de la API de Management si no tienes uno.

  2. Usa la ruta de acceso al archivo kubeconfig del servidor de la API de administración para reemplazar MANAGEMENT_API_SERVER en estas instrucciones.

Solicita permisos y acceso

Para realizar las tareas que se indican en esta página, debes tener el rol de administrador de la VM del proyecto. Sigue los pasos para verificar tu acceso o para que el administrador de IAM del proyecto te asigne el rol de administrador de máquinas virtuales del proyecto (project-vm-admin) en el espacio de nombres del proyecto en el que reside la VM.

Pasa una secuencia de comandos de inicio

Puedes usar secuencias de comandos bash o no bash como secuencias de comandos de inicio. Para ello, incluye #!/bin/… al comienzo de la secuencia de comandos para indicar el intérprete de la secuencia de comandos. Por ejemplo, para usar una secuencia de comandos de inicio de Python 3, agrega #! /usr/bin/python3 al comienzo de la secuencia de comandos.

Google Distributed Cloud (GDC) con aislamiento de aire ejecuta las secuencias de comandos de inicio en orden alfabético, según el nombre de cada secuencia de comandos de inicio.

En la siguiente tabla, se muestra el formato de secuencia de comandos que debes usar según el tamaño de tu secuencia de comandos:

Tamaño del script Formato de secuencia de comandos
Secuencias de comandos de hasta 2,048 bytes Borrar texto
Secuencias de comandos de más de 2,048 bytes Secret de Kubernetes

Define una secuencia de comandos de inicio

Para usar una secuencia de comandos de inicio, debes agregar el campo startupScripts al campo spec de la VM. En este campo, puedes especificar varias secuencias de comandos de inicio como texto sin formato o como un secreto de Kubernetes.

En el siguiente ejemplo, se especifican las secuencias de comandos de inicio como texto sin encriptar y un secreto de Kubernetes:

apiVersion: virtualmachine.gdc.goog/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  
  startupScripts:
  - name: hello-world
    script: |
      #!/bin/bash
      echo hello
  - name: add-user
    scriptSecretRef:
      name: add-user
---

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: add-user
data: 
  script:
    IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==

Revisa las siguientes consideraciones:

  • La secuencia de comandos de inicio se ejecuta en cada inicio.
  • La secuencia de comandos de inicio tiene privilegios de raíz predeterminados.
  • En el secreto de Kubernetes, el nombre de scriptSecretRef en la VM spec debe coincidir con el campo metadata.name.
  • En el secreto de Kubernetes, especifica el contenido de la secuencia de comandos de inicio agregando una clave script al campo data.

Crea una VM nueva con una secuencia de comandos de inicio

Estas instrucciones se aplican independientemente de lo que uses como imagen para crear tu VM. Completa lo siguiente:

  1. Para crear una secuencia de comandos de inicio como un secreto de Kubernetes, ejecuta el siguiente comando:

    cat <<EOF >>FILE_NAME
    STARTUP_SCRIPT_CONTENT
    EOF
    
    kubectl --kubeconfig MANAGEMENT_API_SERVER create secret -n PROJECT generic SECRET_NAME --from-file=script=FILE_NAME
    
    rm FILE_NAME
    
  2. Consulta los pasos para crear una VM, como se describe en la página Crea una VM. En el paso uno, agrega la secuencia de comandos de inicio o las secuencias de comandos al campo spec antes de ejecutar el comando para crear una VM.

    En este ejemplo, se define una secuencia de comandos de inicio con texto sin encriptar y un secreto de Kubernetes:

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachine
    metadata:
    name: VM_NAME
    namespace: PROJECT
    spec:
    
    startupScripts:
    - name: CLEAR_TEXT_SCRIPT_NAME
      script: |
        #!/bin/bash
        CLEAR_TEXT_SCRIPT
    - name: SECRET_SCRIPT_NAME
      scriptSecretRef:
        name: SECRET_NAME
    

    Estas variables se definen de la siguiente manera:

    VariableDefinición
    MANAGEMENT_API_SERVER Es el archivo kubeconfig del servidor de la API de Management.
    PROJECT Es el proyecto de Distributed Cloud en el que deseas crear la VM.
    VM_NAME El nombre de la VM
    FILE_NAME Nombre del archivo en el que se almacenará la secuencia de comandos de inicio.
    STARTUP_SCRIPT_CONTENT Comandos que se ejecutarán como parte de la secuencia de comandos de inicio
    CLEAR_TEXT_SCRIPT_NAME Nombre de la secuencia de comandos de inicio de texto no encriptado.
    CLEAR_TEXT_SCRIPT Es el texto sin formato que defines.
    SECRET_NAME Nombre del secreto de Kubernetes.
    SECRET_SCRIPT_NAME Nombre de la secuencia de comandos de inicio como un secreto de Kubernetes.
  3. Continúa con los siguientes pasos para crear una VM.

    A continuación, se muestra un ejemplo de cómo crear una VM con secuencias de comandos de inicio que agregan un usuario nuevo con un secreto de Kubernetes y texto sin encriptar.

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
        apply -n PROJECT -f - <<EOF
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineDisk
    metadata:
      name: VM_BOOT_DISK_NAME
    spec:
      source:
        image:
          name: BOOT_DISK_IMAGE_NAME
          namespace: vm-system
      size: BOOT_DISK_SIZE
    ---
    apiVersion: v1
    kind: Secret
    type: Opaque
    metadata:
      name: add-user
    data: 
      script:
        IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==
    ---
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      compute:
        virtualMachineType: MACHINE_TYPE
      disks:
      - virtualMachineDiskRef:
          name: VM_BOOT_DISK_NAME
        boot: true
        autoDelete: BOOT_DISK_AUTO_DELETE
      startupScripts:
      - name: add-user
        scriptSecretRef:
          name: add-user
      - name: add-to-sudoers
        script: |
          #!/bin/bash
          usermod -aG sudo user
    EOF
    

    En el ejemplo, las variables se definen de la siguiente manera.

    VariableDefinición
    MANAGEMENT_API_SERVER Es el archivo kubeconfig del servidor de la API de Management.
    PROJECT Es el proyecto de Distributed Cloud en el que deseas crear la VM.
    VM_NAME Nombre de la VM nueva
    VM_BOOT_DISK_NAME Nombre del nuevo disco de arranque de la VM.
    BOOT_DISK_IMAGE_NAME Es el nombre de la imagen que se usará para el disco de arranque de la VM nueva.
    BOOT_DISK_SIZE Tamaño del disco de arranque, como 20G.
    Este valor siempre debe ser mayor o igual que el minimumDiskSize de la imagen del disco de arranque.
    BOOT_DISK_AUTO_DELETE Puede ser true o false, lo que indica si el disco de arranque se borra automáticamente cuando se borra la instancia de VM.
    MACHINE_TYPE Es el tipo de máquina predefinido para la VM nueva. Para seleccionar un tipo de máquina disponible, ejecuta este comando:
    kubectl --kubeconfig MANAGEMENT_API_SERVER get virtualmachinetype.virtualmachine.gdc.goog --namespace vm-system

Actualiza una VM existente con una secuencia de comandos de inicio

También puedes actualizar una VM existente con una secuencia de comandos de inicio. La VM debe apagarse antes de realizar la actualización.

Sigue los pasos para actualizar las propiedades de la VM y actualizar el campo spec con el script de inicio que deseas ejecutar.

Visualiza el resultado de una secuencia de comandos de inicio

  1. Sigue los pasos para conectarte a una VM.
  2. Ejecuta el siguiente comando dentro de la VM invitada para obtener los registros de la secuencia de comandos de inicio que ejecutaste:

    sudo journalctl -u cloud-final
    

    Los registros de la secuencia de comandos de inicio comienzan con lo siguiente:

    Started to run the command: /var/lib/google/startup-scripts/<script-name> ...