Généralement, lorsqu'un ingénieur DevOps provisionne une machine virtuelle dans l'environnement vSphere IaaS control plane, un modèle OVF inclut des détails codés en dur, tels que la configuration réseau de base. Cependant, vous pouvez ne pas connaître et souvent ne pas attribuer certaines valeurs aux propriétés OVF de la machine virtuelle, telles que les données réseau fournies par IPAM, jusqu'à ce que la CR de machine virtuelle soit créée. Avec la prise en charge des chaînes de modèles, vous n'avez pas besoin de connaître les informations réseau à l'avance. Vous pouvez utiliser des modèles basés sur Golang pour remplir les valeurs de propriété OVF et configurer la pile réseau de la machine virtuelle.

Procédure

  1. Assurez-vous que pour toutes les propriétés à configurer, votre fichier OVF inclut l'entrée ovf:userConfigurable="true".
    Cette entrée permet au système de remplacer les espaces réservés des valeurs de mise en réseau, telles que les serveurs de noms et l'adresse IP de gestion, par des données réelles après la collecte des données.
    Utilisez l'exemple suivant.
    <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. Créez le fichier YAML de la machine virtuelle avec des chaînes de modèle.
    Les chaînes de modèle pour les ressources de démarrage collectent les données nécessaires pour remplir les valeurs des propriétés OVF.
    Vous pouvez utiliser l'une des méthodes suivantes pour créer des chaînes de modèle.
    • Utilisez vm-operator-api.

      Pour plus d'informations, reportez-vous à la page suivante sur GitHub : https://github.com/vmware-tanzu/vm-operator/blob/main/api/v1alpha2/virtualmachinetempl_types.go.

      Voici un exemple de fichier YAML :
      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 }}"
    • Utilisez les fonctions suivantes.
      Nom de la fonction Signature Description
      V1alpha2_FirstIP Chaîne func () Obtenez la première adresse IP non-loopback à partir de la première carte réseau.
      V1alpha2_FirstIPFromNIC Chaîne func (entier index) Obtenez une adresse IP non-loopback à partir de la carte réseau ith. Si l'indicateur est hors limites. La chaîne de modèle ne sera pas analysé.
      V1alpha2_FormatIP chaîne func (chaîne IP, chaîne du masque de réseau) Formatez une adresse IP avec la longueur du réseau. Un masque de réseau peut être la longueur, par exemple, /24, ou la notation décimale, par exemple, 255.255.255.0.

      Si le masque de réseau d'entrée n'est pas valide ou est différent du masque par défaut, il ne sera pas analysé.

      V1alpha2_FormatNameservers Chaîne func (entier nombre, chaîne de délimiteur) Formatez le premier nombre rencontré de serveurs de noms avec un délimiteur spécifique. Un nombre négatif pour le nombre signifie tous les serveurs de noms.
      V1alpha2_IP Chaîne func (chaîne IP) Formatez une adresse IP statique avec le CIDR de masque de réseau par défaut.

      Si l'adresse IP n'est pas valide. La chaîne de modèle ne sera pas analysé.

      V1alpha2_IPsFromNIC Chaîne func (entier index) [] Répertoriez toutes les adresses IP de la carte réseau.

      Si l'indicateur est hors limites. La chaîne de modèle ne sera pas analysé.

      Si vous utilisez les fonctions, le fichier YAML ressemble à ce qui suit :
      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. Déployez la machine virtuelle.
    kubectl apply -f file_name.yaml

Que faire ensuite

Si la personnalisation échoue et que la machine virtuelle n'obtient pas d'adresse IP, inspectez la machine virtuelle à l'aide de la console Web de vSphere. Reportez-vous à la section Dépanner les machines virtuelles à l'aide de la console Web de machine virtuelle vSphere.