自分は仕事でVMware vSphere APIとAnsible Towerを使って自動化の開発をしてたりしているのですが、ふとvCenterを使わずにESXi単体とAnsible TowerでVMのクローンを作る自動化が出来たら面白いかもしれないと思いちょっとやってみました。
環境
項目 | バージョン |
---|---|
ESXi | 6.7.0 8169922 |
Ansible Tower | 3.4.2 |
Ansible | 2.7.8 |
事前準備
- ESXiのSSHを有効化しておく必要があります
Ansibleモジュールについて
コミュニティにある標準モジュールでは、今回やりたいことが出来そうになかったので以下のモジュールを作りました。
vmware_guest_register_operation
このモジュールは、vmx(vmtx)ファイルのパスを指定してESXiにVMを登録したり登録解除したりすることが出来るモジュールです。
vmware_guest_powered_on_operation_question
このモジュールは、ソースとなるVMをコピーしたものに対して電源ONをすると質問される回答を自動でしてくれるモジュールです。
VMクローン方法
Playbook
今回使うPlaybookです。
vm_password
はVaultで暗号化してコピペするか直書きしてください。
タスク説明
Get datastore infomation
マウントしているデータストアの情報を取得します。
datastore_path
変数にデータストアのパスを自動設定するために vmware_datastore_facts
で情報を取得します。
Set datastore path variable
datastore_path
にデータストアのフルパスを設定します。
Create a directory to store virtual machines
作成するVMを保存するためのディレクトリを作成します。
Copy vmdk file(Multiple file support)
クローン元のvmdkをクローン先のvmdkにリネームして保存します。
複数のvmdkに対応しています。
Copy vmx file
クローン元のvmxファイル(VM構成ファイル)をクローン先のディレクトリにリネームして保存します。
Replace vmx file parameter
vmxファイルで変更する必要があるパラメータを置換します。
Register VM to inventory
対象のESXiにコピーしたVMを自動でインベントリに登録します。
path
オプションにはESXiのWebUIから確認できるVMが保存されているパスを指定します。
VM power operation
インベントリに登録したVMを起動します。
普通に起動するとVMがコピーされたか移動したか?の質問がされてしまうので、このモジュールでは自動で回答しています。
Ansible Tower設定
ここではSCMタイプを手動で作るので、以下のようにプロジェクトを用意します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[root@ansible ~]# cd /var/lib/awx/projects/ [root@ansible projects]# mkdir esxi_clone_operation [root@ansible projects]# cd esxi_clone_operation/ [root@ansible esxi_clone_operation]# curl -L https://raw.githubusercontent.com/ansible/ansible/devel/lib/ansible/modules/cloud/vmware/vmware_guest_register_operation.py -O [root@ansible esxi_clone_operation]# curl -L https://raw.githubusercontent.com/sky-joker/ore-ore-ansible/master/modules/cloud/vmware/vmware_guest_powered_on_operation_question.py -O [root@ansible esxi_clone_operation]# mkdir library [root@ansible esxi_clone_operation]# mv *.py library/ [root@ansible esxi_clone_operation]# curl -L https://gist.githubusercontent.com/sky-joker/4d840afa4e0c5f719b93b1636c6aa2fd/raw/a2cdfc7d794cf87f217f59241cae92d2ef8663fd/clone_vm.yml -O [root@ansible esxi_clone_operation]# vi clone_vm.yml (snip) vars: vm_password: !vault | $ANSIBLE_VAULT;1.1;AES256 ............ |
プロジェクトの設定は以下のようにしました。
テンプレートは以下のようにしました。
インベントリーにはESXiホストを登録しています。
テンプレートに設定している追加変数は以下の通りです。
1 2 3 4 5 6 7 8 9 10 |
--- source_vm: RHEL7_TMP esxi_hostname: esxi-10.local vm_hostname: 192.168.0.35 vm_username: root datastore: NFS clone_vms: - name: RHEL7_TEST disk_type: thin |
パラメーター | 説明 |
---|---|
source_vm | クローン元になるVM名 |
esxi_hostname | クローンしたVMを登録するESXi名(WebClientで確認できるもの) |
vm_hostname | SSHで接続するESXi |
vm_username | ESXiにログインするユーザー名 |
datastore | マウントしているデータストア名 |
clone_vms | クローンするVM名(複数クローンする事を想定してリストで定義) |
disk_type | ディスクタイプの zeroedthick thin eagerzeroedthick を指定 |
クローン実行
以下は、例ですがクローンした時の動画です。(設定しているパラメーターは上記と一部違います)
ESXi single clone vm demo from sky_joker on Vimeo.
後は、クローンしたVMに対して vmware_vm_shell などを使ってOSの設定をすれば出来上がりかと思います。
これってどう言うシーンで使うの?
うーん、エンタープライズであればvCenterは普通にあると思うので、例えばESXi単体で複数のVMを使うような検証環境を作るシーンとかですかね。
自宅環境とかだと便利かもしれない…
追記
データストアからVMを登録するこのモジュールをマージしてもらえました。
Ansible upstream devel
VMware Collections