vmware_guestモジュールを使って同じ名前のVMを作る方法


この投稿はAnsible 2 Advent Calendar 2019(通称裏アドベントカレンダー?)の8日めの記事です。
1週間全部俺の1回目です!今週は突っ走っていきたいと思います!

最初のネタはvmware_guestを使って同じ名前のVMを作るTipsです。
どういうことをやりたいのかというとこう言う事です。

このように、通常はVMのフォルダを分けることで同じ名前のVM01を作成することができます。
ただし、vmware_guestモジュールを使って同じ名前のVMをフォルダ別で作成するにはやり方があります。

前提条件

ここから作れない方法と作れる方法の説明をするのですが、前提条件としてVM01はTenantAのフォルダにのみ存在し、TenantBフォルダには存在しないものとします。
そのため、PlaybookはTenantBフォルダにVM01を作成(クローン)するものを例とします。

作れないパターン

作れないパターンのPlaybookです。

一見 folder が分かれているので作れると思えそうですが実は作れません。
これは、module_utilsのvmware.pyにある次の処理が原因です。

名前パラメーターでVMを指定している場合は、名前をキーにしてvCenterで管理しているVMの全検索して1つ以下の場合はその情報を戻します。
なので、同じ名前で作りたいVM名が1つのみ存在した場合は、フォルダー条件処理が無いためそのまま情報を戻すので既にVMが存在しているということで作成されません。
困りましたね〜。VM作りたいんです。同じ名前の。

作れるパターン

と、言うことで作れるパターンは uuid を指定してあげます。

uuidは、まず存在しない番号でいいです。
ここでは 0 を指定しています。

何故uuidを指定すればうまくいくかというのは以下のコードを見てください。

nameよりuuidが優先されているので、uuid検索処理を実行しそもそも存在しないuuidなのでvm_objは空です。
なので、vCenter上には存在しないものと判断され対象フォルダーに同じVM名で作成されます。

最後に

こんな感じでしばらくは対処するしかなさそうです。
ちなみに、これに気づいてパッチをPRしていましたがVMの検索を利用している全モジュールに影響があるためかどっちつかずな状態です。
一応、回避策はあるのでワークアラウンドで対応するしかなさそうです。

以上!次!

Leave a Reply

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください