通常、DevOps エンジニアが vSphere IaaS control plane 環境で仮想マシンをプロビジョニングする場合、OVF テンプレートには基本的なネットワーク構成などのハードコーディングされた詳細が含まれます。ただし、多くの場合、仮想マシンの CR が作成されるまで、IP アドレス管理によって提供されるネットワーク データなどの特定の値を仮想マシンの OVF プロパティに割り当てることはできません。テンプレート文字列のサポートにより、ネットワーク情報を事前に把握しておく必要はありません。Golang ベースのテンプレート化を使用して OVF プロパティ値をポピュレートし、仮想マシンのネットワーク スタックを構成できます。
手順
- 構成するすべてのプロパティについて、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>
- テンプレート文字列を使用して仮想マシンの 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 }}"
- vm-operator-api を使用します。
- 仮想マシンをデプロイします。
kubectl apply -f file_name.yaml
次のタスク
カスタマイズに失敗して仮想マシンが IP アドレスを取得しない場合は、vSphere 仮想マシン Web コンソールを使用して仮想マシンを検査します。vSphere 仮想マシン Web コンソールを使用した仮想マシンのトラブルシューティングを参照してください。