Contents
この投稿はAnsible 2 Advent Calendar 2019(通称裏アドベントカレンダー?)の8日めの記事です。
1週間全部俺の1回目です!今週は突っ走っていきたいと思います!
最初のネタはvmware_guestを使って同じ名前のVMを作るTipsです。
どういうことをやりたいのかというとこう言う事です。
このように、通常はVMのフォルダを分けることで同じ名前のVM01を作成することができます。
ただし、vmware_guestモジュールを使って同じ名前のVMをフォルダ別で作成するにはやり方があります。
前提条件
ここから作れない方法と作れる方法の説明をするのですが、前提条件としてVM01はTenantAのフォルダにのみ存在し、TenantBフォルダには存在しないものとします。
そのため、PlaybookはTenantBフォルダにVM01を作成(クローン)するものを例とします。
作れないパターン
作れないパターンのPlaybookです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
--- - name: Clone VM from template hosts: localhost gather_facts: no vars: hostname: vcenter-test01.local username: administrator@vsphere.local password: password tasks: - vmware_guest: hostname: "{{ hostname }}" username: "{{ username }}" password: "{{ password }}" validate_certs: no datacenter: DC folder: /vm/TenantB name: VM01 template: CentOS7_TMP state: present |
一見 folder
が分かれているので作れると思えそうですが実は作れません。
これは、module_utilsのvmware.pyにある次の処理が原因です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
(snip) elif 'name' in self.params and self.params['name']: objects = self.get_managed_objects_properties(vim_type=vim.VirtualMachine, properties=['name']) vms = [] (snip) if len(vms) > 1: # We have found multiple virtual machines, decide depending upon folder value if self.params['folder'] is None: (snip) elif vms: # Unique virtual machine found. vm_obj = vms[0] (snip) return vm_obj |
名前パラメーターでVMを指定している場合は、名前をキーにしてvCenterで管理しているVMの全検索して1つ以下の場合はその情報を戻します。
なので、同じ名前で作りたいVM名が1つのみ存在した場合は、フォルダー条件処理が無いためそのまま情報を戻すので既にVMが存在しているということで作成されません。
困りましたね〜。VM作りたいんです。同じ名前の。
作れるパターン
と、言うことで作れるパターンは uuid
を指定してあげます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
- name: Clone VM from template hosts: localhost gather_facts: no vars: hostname: vcenter-test01.local username: administrator@vsphere.local password: password tasks: - vmware_guest: hostname: "{{ hostname }}" username: "{{ username }}" password: "{{ password }}" validate_certs: no datacenter: DC folder: /vm/TenantB uuid: 0 name: VM01 template: CentOS7_TMP state: present |
uuidは、まず存在しない番号でいいです。
ここでは 0
を指定しています。
何故uuidを指定すればうまくいくかというのは以下のコードを見てください。
1 2 3 4 5 6 7 8 9 10 11 |
(snip) if 'uuid' in self.params and self.params['uuid']: if not use_instance_uuid: vm_obj = find_vm_by_id(self.content, vm_id=self.params['uuid'], vm_id_type="uuid") elif use_instance_uuid: vm_obj = find_vm_by_id(self.content, vm_id=self.params['uuid'], vm_id_type="instance_uuid") elif 'name' in self.params and self.params['name']: (snip) |
nameよりuuidが優先されているので、uuid検索処理を実行しそもそも存在しないuuidなのでvm_objは空です。
なので、vCenter上には存在しないものと判断され対象フォルダーに同じVM名で作成されます。
最後に
こんな感じでしばらくは対処するしかなさそうです。
ちなみに、これに気づいてパッチをPRしていましたがVMの検索を利用している全モジュールに影響があるためかどっちつかずな状態です。
一応、回避策はあるのでワークアラウンドで対応するしかなさそうです。
以上!次!