ansible vmware_guest_find モジュールを用いたVM存在確認と後続タスクの制御
これは何
ansibleによるVMwareのVMインスタンス管理の話。 VMインスタンスをコマンド一つで作成して初期設定ができるようにAnsibleで管理している。すでに存在するVMについては、うっかりRebootしたりNW Restartなどが走らないように存在チェックをしてそれらのタスクをスキップしたい。
vmware_guest シリーズの module について
- vmware_guest module
- VMを作るためのモジュール。ansible version 2.2 より使用可能。
- vmware_guest_find module
- vmware_guest_facts module
コードとハマリどころ
コード
# vmware_guest_findはすでにVMがいれば戻り値としてvm_folder.foldersにVMがいるディレクトリが入る(ここで、vm_folderはregisterで定義した変数)。居ない場合もしくは認証がうまく行かなかったなどの場合にはエラーになり、vm_folder.msgにその原因が書かれる。 # 後続のタスクは、VMがまだ居ない場合にのみ実行したい。 - name: check vm exists on vsphere vmware_guest_find: hostname: VMホスト名 username: ユーザ名 password: パスワード name: VMインスタンス名 datacenter: データセンタ register: vm_folder ignore_errors: yes # とりあえず ignore_errorsにしたけどfailed_whenで制御した方が綺麗だったかも。そのうちなおすかも。 - name: create and setting vm block: - name: create vm # ここら辺の中身は今回は略 include: create_vm.yml tags: create_vm - name: setting vm include: setting_vm.yml tags: setting_vm when: (not ("folders" in vm_folder)) and (vm_folder.msg | regex_search("Unable to find folders for VM"))
解説
vmware_guest_find module の戻り値。 Debugで見てみる。
- name: debug debug: msg: "{{ vm_folder }}"
VMがいるとき
"msg": { "changed": false, "failed": false, "folders": [ # これが帰ってくるのが特徴的 "/vm/hoge/development" ] } }
VMがいないとき
TASK [../ex_roles/vsphere_vmmaker : debug] ****************************************************** ok: [test-vmmaker] => { "msg": { "changed": false, "failed": true, "msg": "Unable to find folders for VM test-vmmaker" } # msgが帰ってくる。他の原因でmodule実行が落ちると他のmsgが帰ってくるのでそれを利用する。 }
- find と言う名前がついているので戻り値にBooleanが帰ってくるかと思ったらVM Folderが帰ってくるのだった
- ない時にはFalseが帰ってくるかと思ったらErrorになってしまうのだった
- 単に「find module実行が落ちたらVM設定する」にしてしまうと、なんらかの拍子にmoduleが落ちると意図せずcreate vm, setting vmが走ってしまって嫌だったので、それを念入りに回避するためにmsgを見ている
- もっと綺麗にかければよかったけど安全策をとった形
- find moduleはまだ安定していないので後方互換を取らないかもしれない、と言う注意文言があったのでmsgは変わるかもしれない(This module is flagged as preview which means that it is not guaranteed to have a backwards compatible interface. と書かれていた)
- msgがマッチしている時にだけ設定が走るので、msg文言が変わっても実行しないという安全側に倒れるので良い