Normalmente, quando um engenheiro de DevOps provisiona uma VM no ambiente vSphere with Tanzu, um modelo OVF inclui detalhes codificados, como configuração básica de rede. No entanto, talvez você não saiba e muitas vezes não possa atribuir determinados valores às propriedades OVF da VM, como dados de rede fornecidos pelo IPAM, até que a CR da VM seja criada. Com o suporte a cadeias de caracteres de modelo, você não precisa saber as informações da rede com antecedência. Você pode usar o modelo baseado em Golang para preencher os valores de propriedade OVF e configurar a pilha de rede da VM.

Procedimento

  1. Certifique-se de que, para que todas as propriedades sejam configuradas, seu arquivo OVF inclua a entrada ovf:userConfigurable="true".
    Essa entrada permite que o sistema substitua marcadores de posição de valor de rede, como servidores de nomes e IP de gerenciamento, por dados reais após a coleta dos dados.
    Use o exemplo a seguir.
    ovf
    <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. Crie o arquivo YAML da VM com cadeias de caracteres de modelo.
    As cadeias de caracteres de modelo para recursos de bootstrap coletarão os dados necessários para preencher os valores da propriedade OVF.
    Você pode usar um dos seguintes métodos para construir cadeias de caracteres de modelo.
    • Use vm-operator-api.

      Para obter mais informações, consulte a seguinte página no GitHub: https://github.com/vmware-tanzu/vm-operator-api/blob/master/api/v1alpha1/virtualmachinetempl_types.go.

      Veja a seguir um arquivo YAML de amostra:
      apiVersion: vmoperator.vmware.com/v1alpha1
      kind: VirtualMachine
      metadata:
        name: template-vm
        namespace: test-ns
        annotations:
          vmoperator.vmware.com/image-supported-check: disable
      spec:
        className: best-effort-xsmall
        imageName: haproxy-v0.2.0
        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 .V1alpha1.Net.Nameservers 0) }}"
        hostname: "{{ .V1alpha1.VM.Name }} "                  
        management_ip: "{{ (index (index .V1alpha1.Net.Devices 0).IPAddresses 0) }}"
        management_gateway: "{{ (index .V1alpha1.Net.Devices 0).Gateway4 }}"
    • Use as seguintes funções.
      Nome da função Assinatura Descrição
      V1alpha1_FirstIP func() string Obtenha o primeiro IP sem loopback da primeira NIC.
      V1alpha1_FirstIPFromNIC string func (index int) Obtenha o endereço IP sem loopback da iª NIC. Se o índice estiver fora do limite, a cadeia de caracteres do modelo não será analisada.
      V1alpha1_FormatIP seqüência de caracteres func (IP, seqüência de caracteres de máscara de rede) Formate um endereço IP com comprimento de rede. Uma máscara de rede pode ter o comprimento, por exemplo, /24, ou a notação decimal, por exemplo, 255.255.255.0.

      Se a máscara de rede de entrada não for válida ou diferente da máscara padrão, ela não será analisada.

      V1alpha1_FormatNameservers string func (count int, delimitador string) Formate a primeira contagem ocorrida de servidores de nomes com delimitador específico. Um número negativo para contagem significa todos os servidores de nomes.
      V1alpha1_IP func(IP string) string Formate um endereço IP estático com o CIDR de máscara de rede padrão.

      Se o IP não for válido, a cadeia de caracteres do modelo não será analisada.

      V1alpha1_IPsFromNIC func (index int) []string Liste todos os IPs da iª NIC.

      Se o índice estiver fora do limite, a cadeia de caracteres do modelo não será analisada.

      Se você usar as funções, o arquivo YAML terá a seguinte aparência:
      apiVersion: vmoperator.vmware.com/v1alpha1
      kind: VirtualMachine
      metadata:
        name: template-vm
        namespace: test-ns
        annotations:
          vmoperator.vmware.com/image-supported-check: disable
      spec:
        className: best-effort-xsmall
        imageName: haproxy-v0.2.0
        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: "{{ V1alpha1_FormatNameservers 2 \",\" }}"
        hostname: "{{ .V1alpha1.VM.Name }} "                  
        management_ip: "{{ V1alpha1_FormatIP \"192.168.1.10\" \"255.255.255.0\" }}"
        management_gateway: "{{ (index .V1alpha1.Net.Devices 0).Gateway4 }}"
  3. Implante a VM.
    kubectl apply -f file_name.yaml

O que Fazer Depois

Se a personalização falhar e a VM não obtiver um endereço IP, inspecione a VM usando o console da Web da VM vSphere. Consulte Solucionar problemas de VMs usando o console da vSphere VM Web.