Wenn ein DevOps-Ingenieur eine VM in der vSphere IaaS control plane-Umgebung bereitstellt, enthält eine OVF-Vorlage in der Regel hartcodierte Details wie die grundlegende Netzwerkkonfiguration. Sie wissen es jedoch möglicherweise nicht und können den OVF-Eigenschaften der VM, wie z. B. von IPAM bereitgestellte Netzwerkdaten, bestimmte Werte erst zuweisen, nachdem die VM-CR erstellt wurde. Mit der Unterstützung von Vorlagenzeichenfolgen müssen Sie Netzwerkinformationen nicht im Voraus kennen. Sie können Golang-basierte Vorlagen verwenden, um die OVF-Eigenschaftswerte aufzufüllen und den Netzwerk-Stack der VM zu konfigurieren.

Prozedur

  1. Stellen Sie sicher, dass Ihre OVF-Datei für alle zu konfigurierenden Eigenschaften den Eintrag ovf:userConfigurable="true" enthält.
    Mit diesem Eintrag kann das System Platzhalter für Netzwerkwerte wie z. B. Nameserver und Verwaltungs-IPs durch echte Daten ersetzen, nachdem diese erfasst wurden.
    Verwenden Sie das folgende Beispiel.
    <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. Erstellen Sie die VM-YAML-Datei mit Vorlagenzeichenfolgen.
    Die Vorlagenzeichenfolgen für Bootstrap-Ressourcen erfassen die Daten, die zum Auffüllen der OVF-Eigenschaftswerte erforderlich sind.
    Vorlagenzeichenfolgen können mit einer der folgenden Methoden konfiguriert werden.
    • Verwenden Sie vm-operator-api.

      Weitere Informationen finden Sie auf der folgenden Seite in GitHub: https://github.com/vmware-tanzu/vm-operator/blob/main/api/v1alpha2/virtualmachinetempl_types.go.

      Nachfolgend finden Sie eine YAML-Beispieldatei:
      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 }}"
    • Verwenden Sie die folgenden Funktionen.
      Funktionsname Signatur Beschreibung
      V1alpha2_FirstIP func () string Rufen Sie die erste Nicht-Loopback-IP von der ersten Netzwerkkarte ab.
      V1alpha2_FirstIPFromNIC func (index int) string Rufen Sie die Nicht-Loopback-IP-Adresse von der ith-Netzwerkkarte ab. Wenn der Index außerhalb des zulässigen Bereichs liegt, wird die Vorlagenzeichenfolge nicht analysiert.
      V1alpha2_FormatIP func (IP string, netmask string) string Formatieren Sie eine IP-Adresse mit der Netzwerklänge. Eine Netzmaske kann entweder die Länge (z. B. /24) oder die Dezimalschreibweise sein (z. B. 255.255.255.0).

      Wenn die Eingabenetzmaske ungültig ist oder sich von der Standardmaske unterscheidet, wird sie nicht analysiert.

      V1alpha2_FormatNameservers func (count int, delimiter string) string Formatieren Sie die erste aufgetretene Anzahl von Namenservern mit einem bestimmten Trennzeichen. Eine negative Zahl als Anzahl bedeutet alle Namenserver.
      V1alpha2_IP func(IP string) string Formatieren Sie eine statische IP-Adresse mit Standard-Netzmasken-CIDR.

      Wenn die IP nicht gültig ist, wird die Vorlagenzeichenfolge nicht analysiert.

      V1alpha2_IPsFromNIC func (index int) []string Listet alle IPs der Ith-Netzwerkkarte auf.

      Wenn der Index außerhalb des zulässigen Bereichs liegt, wird die Vorlagenzeichenfolge nicht analysiert.

      Wenn Sie die Funktionen verwenden, sieht die YAML-Datei wie folgt aus:
      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. Stellen Sie die VM bereit.
    kubectl apply -f file_name.yaml

Nächste Maßnahme

Wenn die Anpassung fehlschlägt und die VM keine IP-Adresse erhält, überprüfen Sie die VM mithilfe der vSphere VM-Webkonsole. Weitere Informationen hierzu finden Sie unter Fehlerbehebung bei VMs mithilfe der vSphere VM-Web-Konsole.