AnsibleでVMwareのVMをクローンしてLinuxPrepを使わずNWやホスト名を設定してみる（メモ）

LinuxPrepを使おうとすると、Perlをインストールする必要があります。
ただ、最小構成でCentOSやRHELをインストールしたテンプレートを使いたかったので、ここではvSphere API経由でネットワークとホスト名の設定をするシンプルなPlaybookを作ってみました。
以下は、使い方のメモ書きです。

# 環境

|   項目  |  バージョン   |
|---------|---------------|
| CentOS  | 7.6           |
| vCenter | 6.7           |
| ESXi    | 6.7           |
| Ansible | 2.8.1         |
| pyVmomi | 6.7.1.2018.12 |

# Playbook

[ansible-vmware-test-environment-provisioner](https://github.com/sky-joker/ansible-vmware-test-environment-provisioner)

# 使い方

クローンします。

```shell-session
$ git clone https://github.com/sky-joker/ansible-vmware-test-environment-provisioner.git
$ cd ansible-vmware-test-environment-provisioner
```

varsファイルを修正します。

```
$ vi vars/default.yml
```

```yaml
---
hostname: vCenter ip or hostnameを設定する
username: administrator@vsphere.local
password: パスワードを設定する
datacenter: データセンター名を設定する
folder: "{{ datacenter }}/vm"
state: poweredon
vms:
  - name: example
    template: テンプレートとなるVM名を設定する
    vm_username: OSアカウントの管理者を設定する
    vm_password: OSアカウントの管理者パスワードを設定する
    hardware:
      num_coups: 1
      num_cpu_cores_per_socket: 1
      memory_mb: 2048
    vm_networks:
      - name: VM Network
    guest_networks:
      - name: ens192
        ipv4: 192.168.0.166/24
        ipv4_gateway: 192.168.0.1
        ipv4_dns: 192.168.0.1
```

`hardware` と `vm_networks` は [vmware_guest](https://docs.ansible.com/ansible/latest/modules/vmware_guest_module.html#vmware-guest-module) の項目を参照してください。
複数のVMを作成する場合は以下のようにします。

```yaml
---
hostname: vCenter ip or hostnameを設定する
username: administrator@vsphere.local
password: パスワードを設定する
datacenter: データセンター名を設定する
folder: "{{ datacenter }}/vm"
state: poweredon
vms:
  - name: example
    template: テンプレートとなるVM名を設定する
    vm_username: OSアカウントの管理者を設定する
    vm_password: OSアカウントの管理者パスワードを設定する
    hardware:
      num_coups: 1
      num_cpu_cores_per_socket: 1
      memory_mb: 2048
    vm_networks:
      - name: VM Network
    guest_networks:
      - name: ens192
        ipv4: 192.168.0.166/24
        ipv4_gateway: 192.168.0.1
        ipv4_dns: 192.168.0.1

  - name: example2
    template: テンプレートとなるVM名を設定する
    vm_username: OSアカウントの管理者を設定する
    vm_password: OSアカウントの管理者パスワードを設定する
    hardware:
      num_coups: 1
      num_cpu_cores_per_socket: 1
      memory_mb: 2048
    vm_networks:
      - name: VM Network
    guest_networks:
      - name: ens192
        ipv4: 192.168.0.167/24
        ipv4_gateway: 192.168.0.1
        ipv4_dns: 192.168.0.1

  - name: example3
    template: テンプレートとなるVM名を設定する
    vm_username: OSアカウントの管理者を設定する
    vm_password: OSアカウントの管理者パスワードを設定する
    hardware:
      num_coups: 1
      num_cpu_cores_per_socket: 1
      memory_mb: 2048
    vm_networks:
      - name: VM Network
      - name: VM Network
    guest_networks:
      - name: ens192
        ipv4: 192.168.0.168/24
        ipv4_gateway: 192.168.0.1
        ipv4_dns: 192.168.0.1
      - name: ens224
        ipv4: 192.168.0.169/24
        ipv4_gateway: ""
        ipv4_dns: ""
```

実行します。

```shell-sesshon
$ ansible-playbook main.yml
```

削除する時はvarsの `state` を `absent` にします。

```yaml
---
hostname: vCenter ip or hostnameを設定する
username: administrator@vsphere.local
password: パスワードを設定する
datacenter: データセンター名を設定する
folder: "{{ datacenter }}/vm"
state: absent
(snip)
```