Contents
VMware HorizonとAnsibleを組み合わせてフルクローンのVMをデスクトッププールへの追加までを自動化してみました。
ここではCLIとAWXのワークフローでやってみます。(Ansible Towerだと評価ライセンスが必要なのでAWXを使います。)
環境
項目 | バージョン |
---|---|
VMware Horizon | 7.9.0 |
Ansible(CLI) | 2.8.2 |
AWX | 6.0.0 |
ここでやること
- CLI
- VM追加
- VMのクローンを作る
- クローンしたVMをHorizonのデスクトッププールへ追加する
- VM削除
- Horizonの仮想デスクトッププールからVMを削除
- vCenterのインベントリとdatastoreからVMを削除
- VM追加
- AWX
- CLIと同じことをAWXのワークフローを使ってやってみます
準備
ansible-for-horizonをクローン
以下のコマンドを実行してリポジトリをクローンします。
このリポジトリには、自作したVMをデスクトッププールへの追加・削除するモジュールがあります。(時間があったら色々増やしていきたい…)
1 2 |
(venv) [root@c72ad9c139dd horizon]# git clone https://github.com/sky-joker/ansible-for-horizon.git |
Playbookの作成
クローンしたリポジトリのディレクトリ移動します。
1 2 |
(venv) [root@c72ad9c139dd horizon]# cd ansible-for-horizon/ |
VMをクローンしてデスクトッププールへ追加するPlaybookを作成します。
1 2 |
(venv) [root@c72ad9c139dd ansible-for-horizon]# vi clone_vm_and_add_to_desktop_pool.yml |
ここでは、以下のように作成しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
--- - name: Clone vm and add it to the desktop pool hosts: windows gather_facts: no tasks: - name: Clone vm from template. vmware_guest: hostname: "{{ vcenter_hostname }}" username: "{{ vcenter_username }}" password: "{{ vcenter_password }}" validate_certs: no datacenter: "{{ datacenter }}" folder: "{{ folder }}" cluster: "{{ cluster }}" template: "{{ template }}" datastore: "{{ datastore }}" name: "{{ name }}" networks: "{{ networks }}" customization: autologon: "{{ autologon }}" dns_servers: "{{ dns_servers }}" password: "{{ domain_user_password }}" domainadmin: "{{ domain_user }}" domainadminpassword: "{{ domain_user_password }}" joindomain: "{{ domain }}" state: poweredon delegate_to: localhost - name: Add vm to desktop pool. vmware_horizon_desktop: hostname: "{{ cs_server }}" username: "{{ cs_username }}" password: "{{ cs_password }}" domain: "{{ domain }}" validate_certs: no vcenter_server: "{{ vcenter_hostname }}" desktop_pool: "{{ desktop_pool }}" name: "{{ name }}" state: present |
次にVMをデスクトッププールとデータストアから削除するPlaybookを作成します。
1 2 |
(venv) [root@c72ad9c139dd ansible-for-horizon]# vi delete_vm_from_desktop_pool_and_datastore.yml |
ここでは、以下のようにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
--- - name: Delete vm from desktop pool and datastore hosts: windows gather_facts: no tasks: - name: Delete vm from desktop pool. vmware_horizon_desktop: hostname: "{{ cs_server }}" username: "{{ cs_username }}" password: "{{ cs_password }}" domain: "{{ domain }}" validate_certs: no vcenter_server: "{{ vcenter_hostname }}" desktop_pool: "{{ desktop_pool }}" name: "{{ name }}" state: absent - name: Delete vm from vCenter inventory and datastore. vmware_guest: hostname: "{{ vcenter_hostname }}" username: "{{ vcenter_username }}" password: "{{ vcenter_password }}" validate_certs: no datacenter: "{{ datacenter }}" folder: "{{ folder }}" cluster: "{{ cluster }}" name: "{{ name }}" state: "{{ item }}" loop: - poweredoff - absent delegate_to: localhost |
extra_varsの作成
次にPlaybookで使うextra_varsファイルを作成します。
1 2 |
(venv) [root@c72ad9c139dd ansible-for-horizon]# vi extra_vars |
ここでは、以下のように作成しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
--- # VMware parameters. vcenter_hostname: 192.168.0.111 vcenter_username: administrator@vsphere.local vcenter_password: secret datacenter: DC folder: /vm/Horizon cluster: Cluster01 template: Windows10_TMP datastore: datastore1 (1) name: CLIENT03 networks: - name: "VM Network" autologon: no dns_servers: - 192.168.0.180 domain: example.local domain_user: administrator domain_user_password: secret # Horizon parameters. cs_server: 192.168.0.181 cs_username: administrator cs_password: secret desktop_pool: POOL01 |
変数名 | 説明 |
---|---|
vcenter_hostname | vCenterサーバの名前解決ができるホスト名、IPアドレス |
vcenter_username | vCenterへログインするユーザー名 |
vcenter_password | vCenterへログインするユーザーのパスワード |
datacenter | vCenterのデータセンター |
folder | VMが存在するフォルダパス |
cluster | VMが存在するクラスタ名 |
template | VMのクローン元 |
datastore | VMが存在するデータストア名 |
name | VM名 |
networks | VMのネットワーク |
autologon | 自動ログオン(sysprepで必要) |
dns_servers | DNSリスト(Active Directory) |
domain | ジョインする先のドメイン名(sysprepで必要) |
domain_user | ジョインする先のドメインユーザー(sysprepで必要) |
domain_user_password | ジョインする先のドメインユーザーのパスワード(sysprepで必要) |
cs_server | Connection Serverの名前解決が出来るホスト名、IPアドレス |
cs_username | Connection Serverへログインするユーザー名 |
cs_password | Connection Serverへログインするユーザーのパスワード |
desktop_pool | VMが存在するデスクトッププール名 |
実行
実行してみます。
以下がデモ動画です。
CLIで実行
Demo to clone VM and add to desktop pool with Ansible from sky_joker on Vimeo.
AWXで実行
Demo to clone VM and add to desktop pool with AWX(Ansible Tower) from sky_joker on Vimeo.
最後に
今回は、フルクローンの作成からデスクトッププールの登録までAnsibleを使って自動化してみました。
結構フルクローン構築の運用ってめんどいんですよね…。
こうやって自動化すればオペレーターの運用負荷も下がるかもしれませんね!後はサイレントインストールが対応しているアプリケーションであればクローン後にインストールも自動化することも可能です 🙂
Horizon PowerCLIを使ってView APIの操作をAnsibleから出来ることも確認できました。
今後は、プールの作成やインスタント・リンククローンなどのモジュールも作っていければと思います。
それでは、みんなでハッピーオートメーション!