Por lo general, cuando un ingeniero de desarrollo y operaciones aprovisiona una máquina virtual en el entorno de vSphere IaaS control plane, una plantilla de OVF incluye detalles codificados de forma rígida, como la configuración básica de red. Sin embargo, es posible que no sepa (y a menudo no pueda) asignar ciertos valores a las propiedades de OVF de la máquina virtual, como los datos de red proporcionados por IPAM, hasta después de crear el recurso personalizado de la máquina virtual. Gracias a la compatibilidad con cadenas de plantillas, no es necesario conocer la información de red de antemano. Puede utilizar plantillas basadas en Golang para rellenar los valores de propiedades de OVF y configurar la pila de red de la máquina virtual.

Procedimiento

  1. Asegúrese de que el archivo OVF incluya la entrada ovf:userConfigurable="true" para que se configuren todas las propiedades.
    Esta entrada permite que el sistema sustituya los marcadores de posición del valor de redes, como servidores de nombres e IP de administración, por datos reales después de que se recopilen los datos.
    Utilice el siguiente ejemplo.
    <Property ovf:key="hostname" ovf:type="string" ovf:userConfigurable="true" ovf:value="ubuntuguest">
          <Description>Specifies the hostname for the appliance</Description>
    </Property>
    <Property ovf:key="nameservers" ovf:type="string" ovf:userConfigurable="true" ovf:value="1.1.1.1, 1.0.0.1">
          <Label>2.2. DNS</Label>
          <Description>A comma-separated list of IP addresses for up to three DNS servers</Description>
    </Property>
    <Property ovf:key="management_ip" ovf:type="string" ovf:userConfigurable="true">
          <Label>2.3. Management IP</Label>
          <Description>The static IP address for the appliance on the Management Port Group in CIDR format (Eg. ip/subnet mask bits). This cannot be DHCP.</Description>
    </Property>
  2. Cree el archivo YAML de máquina virtual con cadenas de plantilla.
    Las cadenas de plantilla para los recursos de arranque recopilarán los datos necesarios para rellenar los valores de propiedad de OVF.
    Puede utilizar uno de los siguientes métodos para construir cadenas de plantillas.
    • Utilice vm-operator-api.

      Para obtener más información, consulte la siguiente página en GitHub: https://github.com/vmware-tanzu/vm-operator/blob/main/api/v1alpha2/virtualmachinetempl_types.go.

      El siguiente es un archivo YAML de ejemplo:
      apiVersion: vmoperator.vmware.com/v1alpha2
      kind: VirtualMachine
      metadata:
        name: template-vm
        namespace: test-ns
        annotations:
          vmoperator.vmware.com/image-supported-check: disable
      spec:
        className: best-effort-xsmall
        imageName: vmi-xxxx0000
        powerState: poweredOn
        storageClass: wcpglobal-storage-profile
        vmMetadata:
          configMapName: template-vm-1
          transport: vAppConfig
        
      ---
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: template-vm-1
        namespace: test-ns
      data:
        nameservers: "{{ (index .v1alpha2.Net.Nameservers 0) }}"
        hostname: "{{ .v1alpha2.VM.Name }} "                  
        management_ip: "{{ (index (index .v1alpha2.Net.Devices 0).IPAddresses 0) }}"
        management_gateway: "{{ (index .v1alpha2.Net.Devices 0).Gateway4 }}"
    • Utilice las siguientes funciones.
      Nombre de función Firma Descripción
      V1alpha2_FirstIP func () string Obtenga la primera dirección IP que no es de bucle invertido de la primera NIC.
      V1alpha2_FirstIPFromNIC func (index int) string Obtenga la dirección IP que no es de bucle invertido de la i-ésima NIC. Si el índice está fuera de los límites, no se analizará la cadena de plantilla.
      V1alpha2_FormatIP func (IP string, netmask string) string Formatee una dirección IP con la longitud de red. Una máscara de red puede ser una longitud (por ejemplo, /24) o una notación decimal (por ejemplo, 255.255.255.0).

      Si la máscara de red de entrada no es válida o es diferente de la máscara predeterminada, no se procesará.

      V1alpha2_FormatNameservers func (count int, delimiter string) string Formatee el primer recuento de servidores de nombres con un delimitador específico. Un número negativo para el recuento significa todos los servidores de nombres.
      V1alpha2_IP func(IP string) string Formatee una dirección IP estática con el CIDR de máscara de red predeterminado.

      Si la IP no es válida, la cadena de plantilla no se procesará.

      V1alpha2_IPsFromNIC func (index int) []string Enumere todas las IP de la i-ésima NIC.

      Si el índice está fuera de los límites, no se analizará la cadena de plantilla.

      Si utiliza las funciones, el archivo YAML tiene el siguiente aspecto:
      apiVersion: vmoperator.vmware.com/v1alpha2
      kind: VirtualMachine
      metadata:
        name: template-vm
        namespace: test-ns
      spec:
        className: best-effort-xsmall
        imageName: vmi-xxxx0000
        powerState: poweredOn
        storageClass: wcpglobal-storage-profile
        vmMetadata:
          configMapName: template-vm-2
          transport: vAppConfig
        
      ---
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: template-vm-2
        namespace: test-ns
      data:
        nameservers: "{{ V1alpha2_FormatNameservers 2 \",\" }}"
        hostname: "{{ .v1alpha2.VM.Name }} "                  
        management_ip: "{{ V1alpha2_FormatIP \"192.168.1.10\" \"255.255.255.0\" }}"
        management_gateway: "{{ (index .v1alpha2.Net.Devices 0).Gateway4 }}"
  3. Implemente la máquina virtual.
    kubectl apply -f file_name.yaml

Qué hacer a continuación

Si se produce un error en la personalización, y la máquina virtual no obtiene una dirección IP; inspeccione la máquina virtual mediante la consola web de máquina virtual de vSphere. Consulte Solucionar problemas de máquinas virtuales mediante la consola web de máquina virtual de vSphere.