vcd-cli を使って VMware Cloud Director (旧 vCloud Director) ベースの IBM Cloud for VMware Solutions Shared を構成する


# vcd-cli とは

[VMware Cloud Director のドキュメント](https://docs.vmware.com/jp/VMware-Cloud-Director/index.html)
>vcd-cli
vcd-cli は、 VMware Cloud Director 向けのコマンド ライン インターフェイスです。詳細については、 https://vmware.github.io/vcd-cli/ を参照してください。

# IBM Cloud for VMware Solutions Shared とは

>[VMware Solutions Shared の概要](https://cloud.ibm.com/docs/vmwaresolutions?topic=vmwaresolutions-shared_overview&locale=ja)
>IBM Cloud™ for VMware Solutions Shared では、VMware 仮想データ・センター環境のデプロイメントとして、標準化されたデプロイメントとカスタマイズ可能なデプロイメントのどちらかを選択できます。 VMware Solutions Shared の仮想データ・センター・インスタンスを使用すると、IBM がホストする VMware インフラストラクチャー上で、VMware ワークロードを素早くシームレスにクラウドへマイグレーションまたはデプロイできます。 IBM は、VMware vCloud Director が IBM Cloud 上で稼働している、セルフサービスでオンデマンドの VMware クラウド・コンピューティング・プラットフォームを提供します。 この Infrastructure as a Service (IaaS) の オンデマンド・オファリングには、必要に応じて、特定の仮想 CPU (vCPU)、ストレージ、vRAM、ネットワーク、および IP を使用するためのオプションがあります。

# インストール
こちらに手順があります。

>https://vmware.github.io/vcd-cli/install.html

```
% vcd version
vcd-cli, VMware vCloud Director Command Line Interface, 23.0.0
```

# ログイン
組織名を使ってログインします。

```
% vcd login \
daldir01.vmware-solutions.cloud.ibm.com \
00000000000000000000000000000000 \
admin \
--password ******** \
--vdc khayama-vdc \
-w -i
admin logged in, org: '00000000000000000000000000000000', vdc: 'khayama-vdc'
```

# 初期設定の確認
プロビジョニング直後の設定を確認します。

## システム
VMware Cloud Director のバージョンが確認できます。

```
% vcd system info
property                value
----------------------  -------------------------------------------
Description             9.7.0.15470680 Thu Jan 16 14:17:36 UTC 2020
Link
OrganizationReferences
RightReferences
RoleReferences
name                    VMware vCloud Director
```

## カタログ
IBM Cloud に最適化されたテンプレートカタログが用意されています。

```
% vcd catalog list
creationDate              description    isPublished    isShared    name              numberOfMedia    numberOfVAppTemplates  orgName         ownerName    publishSubscriptionType    status      version
------------------------  -------------  -------------  ----------  --------------  ---------------  -----------------------  --------------  -----------  -------------------------  --------  ---------
2019-11-15T16:42:45.023Z                 true           true        Public Catalog                0                        6  public-catalog  system       PUBLISHED                  RESOLVED         69
```

```
% vcd catalog list "Public Catalog"
catalogName     entityType    isPublished    name                            ownerName    status      storageKB  vdcName
--------------  ------------  -------------  ------------------------------  -----------  --------  -----------  ----------------------------
Public Catalog  vapptemplate  true           CentOS-8-Template-Official      system       RESOLVED     33554432  dal10-w02-public-catalog-vdc
Public Catalog  vapptemplate  true           CentOS-7-Template-Official      system       RESOLVED     67108864  dal10-w02-public-catalog-vdc
Public Catalog  vapptemplate  true           RedHat-8-Template-Official      system       RESOLVED     33554432  dal10-w02-public-catalog-vdc
Public Catalog  vapptemplate  true           Windows-2019-Template-Official  system       RESOLVED     41943040  dal10-w02-public-catalog-vdc
Public Catalog  vapptemplate  true           RedHat-7-Template-Official      system       RESOLVED     33554432  dal10-w02-public-catalog-vdc
Public Catalog  vapptemplate  true           Windows-2016-Template-Official  system       RESOLVED     41943040  dal10-w02-public-catalog-vdc
```

## ユーザー
初期は `admin` ユーザーのみです。

```
% vcd user list
  deployedVMQuota  fullName    identityProviderType    isEnabled    isLdapUser    isLocked    name      numberOfDeployedVMs    numberOfStoredVMs  roleNames                     storedVMQuota
-----------------  ----------  ----------------------  -----------  ------------  ----------  ------  ---------------------  -------------------  --------------------------  ---------------
                0              INTEGRATED              true         false         false       admin                       1                    1  Organization Administrator                0
```

## Edge Gateway
Edge Gateway の情報が確認できます。

```
% vcd gateway list
name
-------------------
edge-dal10-bd2b9a98
```

```
% vcd gateway list-config-ip-settings edge-dal10-bd2b9a98      
external_network                 gateway                ip_address
-------------------------------  ---------------------  ------------------
dal10-w02-tenant-external        ['52.117.a.1/24']    ['52.117.a.x']
dal10-w02-service01              ['52.117.b.1/24']    ['52.117.b.y']
DLR_to_EDGE_edge-dal10-bd2b9a98  ['10.255.255.249/30']  ['10.255.255.249']
```


IBM Cloud のプライベートネットワーク内にある共通サービス向けのスタティックルートがあります。

- IaaS endpoints (161.26.0.0/16)
- service endpoints (166.9.0.0/16)


```
% vcd gateway services static-route list edge-dal10-bd2b9a98      
  MTU  Network        Next Hop
-----  -------------  ------------
 1500  161.26.0.0/16  52.117.b.2
 1500  166.9.0.0/16   52.117.b.2
```

デフォルトでは、Edge Gateway を通るすべての通信がブロックされています。


```
% vcd gateway services firewall list edge-dal10-bd2b9a98
    ID  name                              ruleType
------  --------------------------------  --------------
131074  firewall                          internal_high
131075  highAvailability                  internal_high
131076  dns                               internal_high
131073  default rule for ingress traffic  default_policy
```

## Storage Policies
4つのストレージポリシーを使うことができます。

```
vcd search orgVdcStorageProfile
id                                      iopsAllocated    iopsLimit  isDefaultStorageProfile    isEnabled    isVdcBusy    name            numberOfConditions    storageLimitMB    storageUsedMB  vdc                                                  vdcName
------------------------------------  ---------------  -----------  -------------------------  -----------  -----------  ------------  --------------------  ----------------  ---------------  ---------------------------------------------------  -----------
212775c5-5667-4a6e-ab71-f34ab774b71d                0     15000000  true                       true         false        4 IOPS/GB                        0                 0                0  urn:vcloud:vdc:f8346b11-6ed7-4fbe-b0d2-f1d14e3c290c  khayama-vdc
dc8498ee-5c71-4503-9c4e-65a49884a73c                0     15000000  false                      true         false        10 IOPS/GB                       0                 0                0  urn:vcloud:vdc:f8346b11-6ed7-4fbe-b0d2-f1d14e3c290c  khayama-vdc
eb07e7fe-1818-4c11-b4d7-3cc63fcd182f                0            0  false                      true         false        0.25 IOPS/GB                     0                 0                0  urn:vcloud:vdc:f8346b11-6ed7-4fbe-b0d2-f1d14e3c290c  khayama-vdc
fe0faed7-45a6-4be6-82ea-9e5d46c4bb4c                0     15000000  false                      true         false        2 IOPS/GB                        1                 0                0  urn:vcloud:vdc:f8346b11-6ed7-4fbe-b0d2-f1d14e3c290c  khayama-vdc
```

# 構成
簡単な構成をコマンドで実施します。

## ユーザー作成

```shell

vcd user create khayama Passw0rd! 'Organization Administrator' --enabled
```

## Edge Gateway ファイアウォール

### ping 
Edge Gateway への ping 通信を許可します。

```shell:enableEdgePingRule.sh
#!/bin/bash

export PING_RULE_NAME=ping_from_external_to_edge
echo $PING_RULE_NAME

export EDGE_NAME=`vcd gateway list | grep edge`
echo $EDGE_NAME

export EDGE_EXTERNAL_IP=`vcd gateway list-config-ip-settings "$EDGE_NAME" | grep tenant | awk '{print $3}' | cut -d"'" -f2 | cut -d"'" -f1`
echo $EDGE_EXTERNAL_IP

vcd gateway services firewall create $EDGE_NAME \
--name $PING_RULE_NAME \
--action accept \
--type User \
--disabled \
--logging-enabled

export PING_RULE_ID=`vcd gateway services firewall list "$EDGE_NAME" | grep "$PING_RULE_NAME" | awk '{print $1}'`
echo $PING_RULE_ID

vcd gateway services firewall update $EDGE_NAME $PING_RULE_ID \
--destination $EDGE_EXTERNAL_IP:ip \
--service icmp any any

vcd gateway services firewall enable $EDGE_NAME $PING_RULE_ID
```

### ssh
Edge Gateway への ssh 通信を許可します。

```shell:enableEdgeSshRule.sh
#!/bin/bash

export SSH_RULE_NAME=ssh_from_external_to_edge
echo $SSH_RULE_NAME

export EDGE_NAME=`vcd gateway list | grep edge`
echo $EDGE_NAME

export EDGE_EXTERNAL_IP=`vcd gateway list-config-ip-settings "$EDGE_NAME" | grep tenant | awk '{print $3}' | cut -d"'" -f2 | cut -d"'" -f1`
echo $EDGE_EXTERNAL_IP

vcd gateway services firewall create $EDGE_NAME \
--name $SSH_RULE_NAME \
--action accept \
--type User \
--disabled \
--logging-enabled

export SSH_RULE_ID=`vcd gateway services firewall list "$EDGE_NAME" | grep "$SSH_RULE_NAME" | awk '{print $1}'`
echo $SSH_RULE_ID

vcd gateway services firewall update $EDGE_NAME $SSH_RULE_ID \
--destination $EDGE_EXTERNAL_IP:ip \
--service tcp any 22

vcd gateway services firewall enable $EDGE_NAME $SSH_RULE_ID
```

Edge Gateway の SSH 有効化はポータルで行う必要があります。

![Kobito.zC9XFC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/73b51c16-833c-c362-a5c9-6127edece38f.png "Kobito.zC9XFC.png")


### vm_outbound
仮想マシンからのアウトバウンド通信を許可します。

```shell:enableVmOutboundRule.sh
#!/bin/bash

export OUT_RULE_NAME=outbound_from_vm_to_any
echo $OUT_RULE_NAME

export VM_NET="192.168.1.0/24"
echo $VM_NET

export EDGE_NAME=`vcd gateway list | grep edge`
echo $EDGE_NAME

vcd gateway services firewall create $EDGE_NAME \
--name $OUT_RULE_NAME \
--action accept \
--type User \
--disabled \
--logging-enabled

export OUT_RULE_ID=`vcd gateway services firewall list "$EDGE_NAME" | grep "$OUT_RULE_NAME" | awk '{print $1}'`
echo $OUT_RULE_ID

vcd gateway services firewall update $EDGE_NAME $OUT_RULE_ID \
--source $VM_NET:ip 

vcd gateway services firewall enable $EDGE_NAME $OUT_RULE_ID
```

### corp_inbound
企業ネットワークからのインバウンド通信を許可します。

```shell:enableCorpInboundRule.sh
#!/bin/bash

export IN_RULE_NAME=inbound_from_corp_to_any
echo $IN_RULE_NAME

export CORP_NET="203.141.91.0/24"
echo $CORP_NET

export EDGE_NAME=`vcd gateway list | grep edge`
echo $EDGE_NAME

vcd gateway services firewall create $EDGE_NAME \
--name $IN_RULE_NAME \
--action accept \
--type User \
--disabled \
--logging-enabled

export IN_RULE_ID=`vcd gateway services firewall list "$EDGE_NAME" | grep "$IN_RULE_NAME" | awk '{print $1}'`
echo $IN_RULE_ID

vcd gateway services firewall update $EDGE_NAME $IN_RULE_ID \
--source $CORP_NET:ip 

vcd gateway services firewall enable $EDGE_NAME $IN_RULE_ID
```

## VDC Network
ネットワークを定義して作成します。

```shell:createVdcNetwork.sh
#!/bin/bash

export NW_NAME=routed_192_168_1_0_24
echo $NW_NAME

export GW_CIDR="192.168.1.1/24"
echo $GW_CIDR

export EDGE_NAME=`vcd gateway list | grep edge`
echo $EDGE_NAME

vcd network routed create $NW_NAME \
-g $EDGE_NAME \
--subnet $GW_CIDR \
--distributed-interface-enabled
```

## DHCP
DHCP を定義して作成します。

```shell:createDhcpPool.sh
#!/bin/bash

export EDGE_NAME=`vcd gateway list | grep edge`
echo $EDGE_NAME

vcd gateway services dhcp-pool create $EDGE_NAME \
--range 192.168.1.2-192.168.1.254 \
--gateway-ip 192.168.1.1 \
--primary-server 161.26.0.10 \
--secondary-server 161.26.0.11 \
--subnet 255.255.255.0
```

コマンドが正常に完了するために、以下の修正を行う必要がありました。

>[Update dhcp_pool.py by khayama · Pull Request #530 · vmware/vcd-cli](https://github.com/vmware/vcd-cli/pull/530/files)

>[Update gateway.py by khayama · Pull Request #664 · vmware/pyvcloud](https://github.com/vmware/pyvcloud/pull/664/files)

また、Edge Gateway の DHCP 有効化はポータルで行う必要があります。

![Kobito.1ycrbu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/4f298a76-1b30-35ac-9a10-94b68e914153.png "Kobito.1ycrbu.png")


## SNAT

### Outbound to Internet
インターネットにアウトバウンド通信ができるように SNAT ルールを作成します。

```shell:enableInternetSnatRule.sh
#!/bin/bash

export EDGE_EXTERNAL_IP=`vcd gateway list-config-ip-settings "$EDGE_NAME" | grep tenant | awk '{print $3}' | cut -d"'" -f2 | cut -d"'" -f1`
echo $EDGE_EXTERNAL_IP

vcd gateway services nat create-snat $EDGE_NAME \
--original-ip 192.168.1.0/24 \
--translated-ip $EDGE_EXTERNAL_IP \
--desc "Outbound to Internet" \
--vnic 0 \
--enabled \
--logging-enabled
```

### Outbound to Common Service
サービスネットワークにアウトバウンド通信ができるように SNAT ルールを作成します。

```shell:enableServiceSnatRule.sh
#!/bin/bash

export EDGE_SERVICE_IP=`vcd gateway list-config-ip-settings "$EDGE_NAME" | grep service | awk '{print $3}' | cut -d"'" -f2 | cut -d"'" -f1`
echo $EDGE_SERVICE_IP

vcd gateway services nat create-snat $EDGE_NAME \
--original-ip 192.168.1.0/24 \
--translated-ip $EDGE_SERVICE_IP \
--desc "Outbound to Common Service" \
--vnic 1 \
--enabled \
--logging-enabled
```

## VM 作成
vApp という VM グループの中に VM を作成します。
DHCP が機能するように、アダプタタイプを変更し、
パスワード変更を行なって反映します。（反映には少し時間がかかります。）

```shell:createVappCustom.sh
#!/bin/bash

export VAPP_NAME=vapp1
echo $VAPP_NAME
export VM_NAME=vm1
echo $VM_NAME
export NW_NAME=routed_192_168_1_0_24
echo $NW_NAME

# vApp を作成
vcd vapp create $VAPP_NAME \
--catalog "Public Catalog" \
--template CentOS-8-Template-Official \
--network $NW_NAME \
--cpu 4 --memory 8192 --disk-size 40000 \
--storage-profile '2 IOPS/GB' \
--hostname khayama \
--vm-name $VM_NAME

# vApp を停止
vcd vapp stop $VAPP_NAME

# アダプタタイプを VMXNET3 に変更
vcd vm add-nic $VAPP_NAME $VM_NAME \
--adapter-type VMXNET3 \
--primary --connect \
--network $NW_NAME \
--ip-address-mode DHCP 
# --ip-address-mode MANUAL --ip-address 192.168.1.10 \
vcd vm delete-nic $VAPP_NAME $VM_NAME --index 0

# パスワードをカスタマイズ設定
vcd vm update-gc-section $VAPP_NAME $VM_NAME \
--admin-password Passw0rd! \
--disable-reset-password \
--disable-admin-password-auto

# パスワードの変更を反映して起動
vcd vm poweron-force-recustomize $VAPP_NAME $VM_NAME

# vApp の情報確認
vcd vapp info $VAPP_NAME

# vApp の強制削除
# vcd vapp delete $VAPP_NAME -y -f
```

## DNAT
最後に外部から VM へアクセスするために DNAT ルールを作成します。

```shell:enableInbounDnatdRule.sh
#!/bin/bash

export EDGE_NAME=`vcd gateway list | grep edge`
echo $EDGE_NAME

export VM_IP=`vcd vm info $VAPP_NAME $VM_NAME | grep ip | awk '{print $2}'`
echo $VM_IP

vcd gateway services nat create-dnat $EDGE_NAME \
--original-ip 52.117.a.z \
--translated-ip $VM_IP \
--desc "Inbound to VM" \
--vnic 0 \
--enabled \
--logging-enabled \
--protocol tcp \
--original-Port any \
--translated-Port any

```

DNAT 用のパブリック IP は IBM Cloud から払い出されるものを活用できます。

![Kobito.HXh6MQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/e51e2fac-f077-5463-d14c-3151a1d7bc68.png "Kobito.HXh6MQ.png")

 
# 参考

- [vCloud Director テナント ポータル ガイド](https://docs.vmware.com/jp/VMware-Cloud-Director/9.7/com.vmware.vcloud.tenantportal.doc/GUID-74C9E10D-9197-43B0-B469-126FFBCB5121.html)

# 参考 : NSX のバージョン
Edge Gateway に SSH 接続すると以下のコマンドで確認できます。

```
vse-eb077907-871a-4168-aaf9-2feba09aa8f6-0> show version
Name:                 NSX Edge
Version:              6.4.6
Build number:         14780962
Kernel:               4.4.185
```