Ansible: vSphere Guest モジュールについてのまとめ

# Ansible: vSphere Guest モジュールについてのまとめ

- Ansible Advent Calendar 2017 12/12(火) 向けの記事になります。

## 目的

- (すでにご存じの方々も多いかと思いますが...)
- 初学者向けの vSphere Guset 関連モジュールとサンプルコードの紹介
  - 最初に戸惑うことがないように。。
- 過去にいくつか書いたもののまとめ
- 最後にこのネタで書いてからこれまでの差分など

## 対象

以下にリンクされているモジュールを対象とします。

- http://docs.ansible.com/ansible/latest/list_of_cloud_modules.html#vmware

## アジェンダ

1. vSphere Guest 用モジュールの解説
  - 1.1. 大きく2種類ある
  - 1.2. 違い、いい点、悪い点
  - 1.3. 現状でのベストプラクティスは?
1.  使ってみる
  - 2.1 サンプルコード
1. それでもエラーが出たときは?

## 1. vSphere Guest 用モジュールの解説

### 1.1. 大きく2種類ある

2017/12/11 現在、以下の2つの Guest 用モジュールを利用できます。

- vsphere_guest http://docs.ansible.com/ansible/latest/vsphere_guest_module.html
- vmware_guest http://docs.ansible.com/ansible/latest/vmware_guest_module.html

### 1.2. 違い、いい点、悪い点

- いずれかの選択判断材料となりそうな要素を書き出してみます。

| モジュール名 | vsphere_guest | vmware_guest |
| --- | --- | --- |
| 依存する Python モジュール | [pysphere](https://github.com/argos83/pysphere) | [PyVmomi](http://vmware.github.io/pyvmomi/) |
| Python モジュールメインテナー | 個人 かつ すでに開発を辞めている | VMware社 > "http://vmware.github.io/pyvmomi/" |
| vCenter要否 | なくても使えるWorkAroundあり(※1) | vCenter必要(※2) |
| StandAlone ESXi 可否 | 可(※1) | 不可(※2) |
| モジュール ステータス(※3) | preview | preview |

- ※1 esxi パラメーターに "ha-datacenter" を使う
- ※2 Stand Alone ESXi について明文化されたオプションがない
- ※3 http://docs.ansible.com/ansible/latest/dev_guide/developing_modules_documenting.html#fields


### 1.3. 現状でのベストプラクティスは?

1. ESXi をスタンドアロンで使っている場合は vsphere_guest 一択にならざるをえないと思います
1. vCenter がある場合は可能な限り vmware_guest を使いつつ、vmware_guest 利用に問題が生じるような場合に(一時的な)WorkAroundとし限定的に vsphere_guest を利用していくのが良いと思われます


## 2. 使ってみる

  - i. [vmware_guset を使って] CentOS6.9 をテンプレートからデプロイし 60G の Disk を追加、メモリを 4G にして電源 ON
  - ii. [vsphere_guest を使って] DHCP でアサインされた IPアドレス を表示させます

実行環境

| | バージョン |
| --- | --- |
| vSphere | 5.5 |
| ansible | 2.3.3.0 (stable-2.3 797d999513) |
| pyshpere | 0.1.7 |
| pyvmomi | 6.5.0.2017.5.post1 |

ディレクトリ構成

```
│  site.yml
│
├─group_vars
│      all.yml
│
└─roles
    ├─centos6.9-base
    │  └─tasks
    │          main.yml
    │
    └─gather-vm-info
        └─tasks
                main.yml
```

### 2.1 サンプルコード

./site.yml

```yaml:
---
- name: vm deploy test
  hosts: localhost
  gather_facts: false
  connection: local
  roles:
    - centos6.9-base
    - gather-vm-info
    
```

./group_vars/all.yml

```yaml:
---
vc_datacenter: datacenter01
vc_hostname: 192.168.0.91
esxhost: esxi01.local
vc_datastore: 'esxi01:datastore1'
admin_username: admin@vsphere.local
admin_password: hogefuga
vc_network: 'VM Network Private01'
vc_template_c69: Temp_CentOS6.9_x86_64
guest_vm_name: centos6.9-test999

```
- ※サンプル簡素化のためにパスワードを直書きしてますが ansible vault を使って暗号化しましょう

./roles/centos6.9-base/tasks/main.yml

```yaml:
---
- name: create centos6.9 base
  vmware_guest:
    datacenter: "{{ vc_datacenter }}"
    hostname: "{{ vc_hostname }}"
    username: "{{ admin_username }}"
    password: "{{ admin_password }}"
    esxi_hostname: "{{ esxhost }}"
    validate_certs: no
    name: "{{ guest_vm_name }}"
    state: poweredon
    # force: yes
    template: "{{ vc_template_c69 }}"
    disk:
    - size_gb: 40
      type: thin
      datastore: "{{ vc_datastore }}"
    - size_gb: 60
      type: thin
      datastore: "{{ vc_datastore }}"
    hardware:
      memory_mb: 4096
      num_cpus: 2
    wait_for_ip_address: yes
    
```

./roles/gather-vm-info/tasks/main.yml

```yaml:
---
- name: gather vm info
  vsphere_guest:
    vcenter_hostname: "{{ vc_hostname }}"
    username: "{{ admin_username }}"
    password: "{{ admin_password }}"
    validate_certs: no
    guest: "{{ guest_vm_name }}"
    vmware_guest_facts: yes
  register: var
- debug: msg="{{var.ansible_facts.hw_eth0.ipaddresses[0]}}"

```

- コマンド出力結果サンプル

```shell-session
$ ansible-playbook site.yml
 [WARNING]: Host file not found: /etc/ansible/hosts

 [WARNING]: provided hosts list is empty, only localhost is available


PLAY [vm deploy test] ***********************************************************************************

TASK [centos6.9-base : create centos6.9 base] ***********************************************************
changed: [localhost]

TASK [gather-vm-info : gather vm info] ******************************************************************
ok: [localhost]

TASK [gather-vm-info : debug] ***************************************************************************
ok: [localhost] => {
    "msg": "192.168.100.100"
}

PLAY RECAP **********************************************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0
```

## 3. それでもエラーが出たときは?

- 既知の問題で議論されている可能性もあります。
- 以下のようなキーワードでググりましょう

```
site://github.com/ansible fault.NicSettingMismatch.summary
```

- vmware_guest の場合は VMware 側に情報があることもあります。

```
site://communities.vmware.com fault.NicSettingMismatch.summary
```

## 以上