AnsibleでESXiの仮想マシン作成など操作してみる

# はじめに

自宅に古いサーバを再利用したVMware ESXi(仮想サーバ、ぷちプライベートクラウド的なもの)がありまして、そこで、仮想マシンたてて新しい技術の検証やQiitaで気になったこと、試したいことなど色々しています。
ただ、毎回仮想マシンをたてて、OSをインストールするのがすごく手間です。。。
なので、自動化してラクにOSインストール済の仮想マシンを作成できるようにしたいと思います！

#やりたこと
・KickStartを利用したCentOS7を自動インストールするISOファイルを作成する。　←[こちらに記事書きました](http://qiita.com/ynishimura0922/items/de76a83003ce360cf760)
・AnsibleでESXiを操作して、仮想マシンの作成・削除・構成の変更できるようにする。　***←今回これ***


#構成

ポンコツノートPCからansibleで仮想マシンの操作します。

```
                     同一LAN
  ポンコツノートPC    <----------->    ESXiサーバ
ip:192.168.10.10                  ip:192.168.10.8
```

#ファイル構成

```
こんな構成

ansible-vmware/
├── esx-host
├── group_vars
│   └── all.yml
└── vm.yml

```

esx-host作っているけど、メインのファイル(vm.yml)にesxiサーバ情報記載してるため正直いらいない

group_varsにはあまり変動しない環境変数を記載したファイル(all.yml)いれている。
指定するISOは***[こちら](http://qiita.com/ynishimura0922/items/de76a83003ce360cf760
)***で作った自動でOSインストールするISOファイルを指定する


```all.yml
---
esx_hostname: localhost.localdomain
esx_ipaddr: 192.168.10.8 
esx_user: root　
esx_password: <esxiにログインするパスワード>
datastore_name: datastore1
iso_path: datastore1/ISO/centos/CentOS-7-x86_64-DVD-1611_Auto.iso
```

vm.ymlにタスクなどを記載している

```vm.yml
--
- hosts: 127.0.0.1
  connection: local
  user: root
  sudo: false
  gather_facts: false
  serial: 1

  vars_prompt:
    - name: "guest_vm_name"
      prompt: "Please enter guest VM name"
      private: no
      default: "testvm"

    - name: "vm_state"
      prompt: "Please enter guest_vm state \n[state list]\n present\n powered_off\n absent\n powered_on\n restarted\n reconfigured\n"
      private: no
      default: "powered_on"


    - name: "disk_size"
      prompt: "Please input disk-size"
      private: no
      default: "50"

    - name: "mem_size"
      prompt: "Please input memory-size"
      private: no
      default: "2048"

  tasks:
    - name: Deploy guest from template
      vsphere_guest:
        vcenter_hostname: "{{ esx_ipaddr }}"
        username: "{{ esx_user }}"
        password: "{{ esx_password }}"
        guest: "{{ guest_vm_name }}"
        state: "{{ vm_state }}"
        vm_extra_config:
          vcpu.hotadd: yes
          mem.hotadd:  yes
          notes: This is a test VM
        vm_disk:
          disk1:
            size_gb: "{{ disk_size }}"
            type: thin
            datastore: "{{ datastore_name }}"
        vm_nic:
          nic1:
            type: vmxnet3
            network: VM Network
            network_type: standard
        vm_hardware:
          memory_mb: "{{ mem_size }}"
          num_cpus: 2
          osid: centos64Guest
          scsi: paravirtual
          vm_cdrom:
            type: "iso"
            iso_path: "{{ iso_path }}"
        esxi:
          datacenter: ha-datacenter
          hostname: "{{ esx_hostname  }}"

```

#実行方法

```
# ansible-playbook vm.yml

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

[DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and make sure become_method is 'sudo' (default).
This feature will be removed in a future release. 
Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.

上記のような警告でるけど気にしない


Please input guest VM name [testvm]: testvm2　←仮想マシンの名前いれる(デフォルトtestvm)
Please input guest_vm state 
[state list]
 present
 powered_off
 absent
 powered_on
 restarted
 reconfigured
 [powered_on]: powered_on 　　←仮想マシンの状態をいれる(デフォルトpowered_on)
Please input disk-size [50]: 40 　　←仮想マシンに割り当てる容量を指定する
Please input memory-size [2048]: 1024 　　←仮想マシンに割り当てるメモリサイズを指定する
```

#使い方

- ***新規で仮想マシンを作りたい場合***
 - `guest VM name` に作成されていない仮想マシンの名前をいれてください。(作成済の名前をいれてもエラーなど起きませんが、何も作られません。)
 - stateに`powered_on`を指定してください。仮想マシン作成後にCentOS7のインストールが行われます。


- ***仮想マシンを削除またはパワーオフしたい場合***
 -  `guest VM name`に対象の仮想マシン名をいれてください。
 - `state`に`absent`(削除),`powered_off`(電源オフ)を指定してください。
 - ディスク容量、メモリ容量を入力するプロンプトが表示されますが、そのままenterでokです。


- ***仮想マシンのディスク容量、メモリサイズを変更したい***
 -  `guest VM name`に対象の仮想マシン名をいれてください。
 - `state`に`reconfigured`を指定してください。
 - ディスク容量、メモリ容量を入力する際に変更したい値を入力してください。


#工夫した点

・ansibleのvars_prompt使って、仮想マシン名、ディスク容量、メモリサイズをインタラクティブに指定できるようにしました。
・vmtoolsも自動でインストールされるようにしました。

#課題

- 仮想マシンを削除、電源オフするときでも、ディスク容量、メモリを指定するプロンプトが表示される

whenなど使えばの条件分岐できるようなので、時間あれば対応する予定。

- 今のESXiで稼働している仮想マシンの名前や、IPアドレスなどポンコツノートPCからスマートに参照できない。

▼現状
sshでesxiに接続して、下記コマンドを入力して仮想マシンの情報を確認している

```
for i in $(vim-cmd vmsvc/getallvms | awk '{print $1}' | grep -v Vmid); do vim-cmd vmsvc/get.summary $i | grep -E ipAddress\|guestFullName\|powerState; echo "-----"; done
```

- 新規で仮想マシン作成する際にマシンにアクセス可能となるまでに５分ぐらいかかる

仮想マシン作ってから、OSのインストールが走るため、そのインストールが終わるまで、待つ必要がある。
(こればっかりはどうしようもないかな。。dockerなど使えってことですね）

#所感

AWSやvagrant、dockerの技術すばら！革新的！っていうことをあらためて感じました。