vm.gowatana.jp

NEOにほんごVMware(仮)

VMware Cloud Director 10.4 を Ansible で操作してみる。Part-06 複数の DNAT VM を作成するPlaybook 例

VMware Cloud Director 10.4(VCD)に Ansible で vApp と仮想マシンを作成する Playbook の例を残しておこうと思います。

今回の内容です。

 

1. Playbook の作成

これまでの下記投稿をもとに、DNAT 設定された複数の仮想マシンを含む vApp を作成します。

 

1-1. ディレクトリ / YAML ファイルの構成

下記のように、ansible-playbook コマンドで実行する vApp 作成 / 削除の YAML ファイルを作成して、tasks、vars に部分的に YAML ファイルを分割配置しておきます。

./
|-- 01_create.yml
|-- 02_delete.yml
|-- tasks
|   |-- create_dnat.yml
|   |-- create_vapp.yml
|   |-- create_vdc-nw.yml
|   |-- create_vm.yml
|   |-- delete_dnat.yml
|   `-- list_dnat.yml
`-- vars
    |-- login.yml
    |-- vdc-vapp.yml
    `-- vm-nat.yml

 

1-2. YAML ファイルの内容

それぞれの YAML ファイルは、下記のように作成してあります。

 

01_create.yml

組織 VDC ネットワーク、vApp、仮想マシン、DNAT ルールを作成します。

  • L5: 変数は別の YAML ファイルとして分離して、vars ディレクトリ配下に配置してあります。仮想マシンに設定する IP アドレスや DNAT IP アドレスなども、そこにまとめてあります。
  • L20、L26 など: オブジェクトを作成する Task は、変数を渡すループ処理などで扱いやすいように、YAML ファイルを分割して tasks ディレクトリ配下に配位してあります。
  • L64: 最後に、作成した DNAT ルールを表示します。

gist.github.com

 

02_delete.yml

01_create.yml で作成したオブジェクト一式を削除します。

  • L5: 変数を定義してある vars YAML ファイルは、すべての変数を使用しませんが、作成時のファイルをそのまま流用します。
  • L33: オブジェクト作成時と同様に、Task を別の YAML ファイルに分割してあります。
  • L40: 仮想マシンは個別に削除せず、vApp ごとまとめて削除します。

gist.github.com

 

vars/login.yml

変数の定義も、取り扱いやすい粒度で YAML ファイルを分割してあります。

VDC のテナント ポータルにログインする際のアドレスや認証情報をまとめて記載しておきます。ちなみに、プロバイダ ポータルのローカル管理者ユーザで接続する場合は、組織(今回の変数は var_org)に "system" を指定します。

gist.github.com

 

vars/vdc-vapp.yml

組織 VDC ネットワークと、vApp に関連する変数を記載しておきます。

gist.github.com

 

vars/vm-nat.yml

仮想マシンと、DNAT アドレスに関連する変数を記載しておきます。

  • L1 ~: vApp に作成する仮想マシンのクローン元の情報です。ソースとする vApp テンプレート(とそこに含まれる仮想マシン)は事前に作成しておきます。
  • L6 ~: 仮想マシン名と、DNAT ルールで指定する IP アドレスを指定します。
    • vm01 ~ vm03 の 3台を作成します。
    • DNAT での変換先の IP アドレスは、仮想マシン作成後に取得するので、ここでは指定していません。

gist.github.com

 

tasks/create_vdc-nw.yml

VCD 外部のネットワークから組織 VDC の仮想マシンにアクセスできるように、経路指定(Routed)組織 VDC ネットワークを作成します。今回はパラメータを直接指定していますが、vars ファイルに分離したほうが便利かなと思います。

gist.github.com

 

tasks/create_vapp.yml

空の vApp を、パワーオンしない状態で作成します。

gist.github.com

 

tasks/create_vm.yml

vApp に、仮想マシンと vNIC を作成します。

  • L39: なぜか Playbook を再実行するたびに NIC が追加作成されてしまうので、対象仮想マシンに NIC がまだ存在しない場合のみ実行します。

gist.github.com

 

tasks/create_dnat.yml

仮想マシンの vNIC から IP アドレスを取得して、それを変換先とする DNAT ルールを作成します。

  • L1 ~ L7、L58: 作成ずみ仮想マシンの NIC 0 から、IP アドレスを取得します。
  • L9 ~ L39、L64: すでに同名の DNAT ルールが作成されていないか確認します。
  • L41 ~: DNAT ルールを追加します。 

gist.github.com

 

tasks/list_dnat.yml

作成された DNAT ルールを表示する Task です。

今回作成する仮想マシンの vNIC では、IP アドレスを IP プールから自動的に払い出しています。そこで処理の最後に、下記のように作成した NAT ルールの IP アドレス(変換元 -> 変換先)が表示されるようにしてあります。

gist.github.com

 

tasks/delete_dnat.yml

DNAT ルールを削除する Task です。

  • L47: create_dnat.yml とは逆に、ルールが作成されている場合のみ DNAT ルールを削除します。

gist.github.com

 

Playbook の実行

vApp / 仮想マシン / DNAT ルールの作成

下記のように Playbook を実行すると、オブジェクト一式が作成されます。

$ ansible-playbook 01_create.yml

 

処理の最後に、下記のように作成した NAT ルールの IP アドレス(変換元 -> 変換先)が表示されるようにしてあります。

TASK [Get Edge Gateway NAT Rules] ********************************************************************************
ok: [localhost]

TASK [Get Edge Gateway NAT Rule dnat-192.168.31.111] *************************************************************
ok: [localhost]

TASK [Output Edge Gateway NAT Rule IP dnat-192.168.31.111] *******************************************************
ok: [localhost] => {
    "msg": "192.168.31.111 -> 10.0.6.100"
}

TASK [Get Edge Gateway NAT Rules] ********************************************************************************
ok: [localhost]

TASK [Get Edge Gateway NAT Rule dnat-192.168.31.112] *************************************************************
ok: [localhost]

TASK [Output Edge Gateway NAT Rule IP dnat-192.168.31.112] *******************************************************
ok: [localhost] => {
    "msg": "192.168.31.112 -> 10.0.6.101"
}

TASK [Get Edge Gateway NAT Rules] ********************************************************************************
ok: [localhost]

TASK [Get Edge Gateway NAT Rule dnat-192.168.31.113] *************************************************************
ok: [localhost]

TASK [Output Edge Gateway NAT Rule IP dnat-192.168.31.113] *******************************************************
ok: [localhost] => {
    "msg": "192.168.31.113 -> 10.0.6.102"
}

PLAY RECAP *******************************************************************************************************
localhost                  : ok=52   changed=9    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

VCD のテナント ポータルから確認すると、vApp が作成されているはずです。

 

Playbook で指定したとおり、仮想マシンが 3台作成されて、VDC ネットワークに接続されています。

 

vApp vapp-03 には、仮想マシン vm01 ~ vm03 が作成さており、画面を右にスクロールすると・・・

 

組織 VDC ネットワークに設定した IP プールの範囲から、IP アドレスが設定されています。

 

Edge Gateway では、3件の DNAT ルールが作成されていることが確認できます。

「内部 IP」には、仮想マシンの vNIC に割り当てられたものが指定されています。

 

vApp / 仮想マシン / DNAT ルールの削除

下記のように Playbook を実行すると、01_create.yml で作成されたオブジェクト一式が削除されるはずです。

$ ansible-playbook 02_delete.yml

 

以上、これまでの Ansible による VCD 10.4 操作のまとめでした。