通常、DevOps エンジニアが vSphere IaaS control plane 環境で仮想マシンをプロビジョニングする場合、OVF テンプレートには基本的なネットワーク構成などのハードコーディングされた詳細が含まれます。ただし、多くの場合、仮想マシンの CR が作成されるまで、IP アドレス管理によって提供されるネットワーク データなどの特定の値を仮想マシンの OVF プロパティに割り当てることはできません。テンプレート文字列のサポートにより、ネットワーク情報を事前に把握しておく必要はありません。Golang ベースのテンプレート化を使用して OVF プロパティ値をポピュレートし、仮想マシンのネットワーク スタックを構成できます。

手順

  1. 構成するすべてのプロパティについて、OVF ファイルに ovf:userConfigurable="true" エントリが含まれていることを確認します。
    このエントリにより、ネーム サーバや管理 IP アドレスなどのネットワーク値のプレースホルダは、データ収集後に実際のデータに置き換えられます。
    次の例を使用します。
    <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. テンプレート文字列を使用して仮想マシンの YAML ファイルを作成します。
    ブートストラップ リソースのテンプレート文字列によって、OVF プロパティ値のポピュレートに必要なデータが収集されます。
    次のいずれかの方法を使用して、テンプレート文字列を設定できます。
    • vm-operator-api を使用します。

      詳細については、GitHub のページ (https://github.com/vmware-tanzu/vm-operator/blob/main/api/v1alpha2/virtualmachinetempl_types.go) を参照してください。

      サンプルの 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 }}"
    • 次の関数を使用します。
      関数名 署名 説明
      V1alpha2_FirstIP func () string 最初の NIC から最初の非ループバック IP アドレスを取得します。
      V1alpha2_FirstIPFromNIC func (index int) string i 番目の NIC から非ループバック IP アドレスを取得します。インデックスが範囲外の場合、テンプレート文字列は解析されません。
      V1alpha2_FormatIP func (IP string, netmask string) string ネットワークの長さを使用して IP アドレスの書式を設定します。ネットマスクには、長さ(例:/24)または 10 進表記(例:255.255.255.0)のいずれかを使用できます。

      入力されたネットマスクが無効な場合や、デフォルトのマスクとは異なる場合、ネットマスクは解析されません。

      V1alpha2_FormatNameservers func (count int, delimiter string) string 特定の区切り文字を使用して、最初に発生したネーム サーバの数の書式を設定します。負の数は、すべてのネーム サーバを意味します。
      V1alpha2_IP func(IP string) string デフォルトのネットマスク CIDR を使用して固定 IP アドレスの書式を設定します。

      IP アドレスが無効な場合、テンプレート文字列は解析されません。

      V1alpha2_IPsFromNIC func (index int) []string i 番目の NIC からのすべての IP アドレスを一覧表示します。

      インデックスが範囲外の場合、テンプレート文字列は解析されません。

      関数を使用すると、YAML ファイルは次のようになります。
      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. 仮想マシンをデプロイします。
    kubectl apply -f file_name.yaml

次のタスク

カスタマイズに失敗して仮想マシンが IP アドレスを取得しない場合は、vSphere 仮想マシン Web コンソールを使用して仮想マシンを検査します。vSphere 仮想マシン Web コンソールを使用した仮想マシンのトラブルシューティングを参照してください。