In genere, quando un tecnico DevOps esegue il provisioning di una macchina virtuale nell'ambiente vSphere IaaS control plane, un modello OVF include dettagli hardcoded come la configurazione di rete di base. Tuttavia, è possibile che non si sappia e spesso che non sia possibile assegnare determinati valori alle proprietà OVF della macchina virtuale, ad esempio i dati di rete forniti da IPAM, finché la CR della macchina virtuale non viene creata. Con il supporto delle stringhe dei modelli, non è necessario conoscere in anticipo le informazioni della rete. È possibile utilizzare la creazione di modelli basati su Golang per popolare i valori delle proprietà OVF e configurare lo stack di rete della macchina virtuale.

Procedura

  1. Assicurarsi che per tutte le proprietà da configurare, il file OVF includa la voce ovf:userConfigurable="true".
    Questa voce consente al sistema di sostituire i segnaposto dei valori di rete, come i server dei nomi e l'IP di gestione, con i dati reali dopo la raccolta dei dati.
    Utilizzare l'esempio seguente.
    <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. Creare il file YAML della macchina virtuale con le stringhe del modello.
    Le stringhe del modello per le risorse di bootstrap raccoglieranno i dati necessari per popolare i valori delle proprietà OVF.
    È possibile utilizzare uno dei metodi seguenti per creare le stringhe dei modelli.
    • Utilizzare vm-operator-api.

      Per ulteriori informazioni, vedere la pagina seguente in GitHub: https://github.com/vmware-tanzu/vm-operator/blob/main/api/v1alpha2/virtualmachinetempl_types.go.

      Di seguito è disponibile un file YAML di esempio:
      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 }}"
    • Utilizzare le seguenti funzioni.
      Nome della funzione Firma Descrizione
      V1alpha2_FirstIP funzione () stringa Recupera il primo IP non di loopback dalla prima NIC.
      V1alpha2_FirstIPFromNIC funzione (indice int) stringa Recupera l'indirizzo IP non di loopback dalla NIC ith. Se l'indice non è associato, la stringa del modello non verrà analizzata.
      V1alpha2_FormatIP funzione (stringa IP, stringa netmask) stringa Formatta un indirizzo IP con la lunghezza di rete. Una maschera di rete può essere espressa tramite la lunghezza, ad esempio /24, o la notazione decimale, ad esempio 255.255.255.0.

      Se la maschera di rete di input non è valida o diversa dalla maschera predefinita, non verrà analizzata.

      V1alpha2_FormatNameservers funzione (conteggio int, stringa delimitatore) stringa Formatta il primo numero di server dei nomi con un delimitatore specifico. Un numero negativo indica tutti i server dei nomi.
      V1alpha2_IP Funzione(stringa IP) stringa Formatta un indirizzo IP statico con il CIDR della maschera di rete predefinito.

      Se l'IP non è valido, la stringa del modello non verrà analizzata.

      V1alpha2_IPsFromNIC funzione (indice int) []stringa Elenca tutti gli IP della NIC ith.

      Se l'indice non è associato, la stringa del modello non verrà analizzata.

      Se si utilizzano le funzioni, il file YAML sarà simile al seguente:
      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. Distribuire la macchina virtuale.
    kubectl apply -f file_name.yaml

Operazioni successive

Se la personalizzazione non riesce e la macchina virtuale non ottiene un indirizzo IP, ispezionare la macchina virtuale utilizzando la console Web della macchina virtuale vSphere. Vedere Risoluzione dei problemi relativi alle macchine virtuali mediante la console Web della macchina virtuale vSphere.