これは何
ansibleによるVMwareのVMインスタンス管理の話。
VMインスタンスをコマンド一つで作成して初期設定ができるようにAnsibleで管理している。すでに存在するVMについては、うっかりRebootしたりNW Restartなどが走らないように存在チェックをしてそれらのタスクをスキップしたい。
vmware_guest シリーズの module について
- vmware_guest module
- VMを作るためのモジュール。ansible version 2.2 より使用可能。
- vmware_guest_find module
- VMが存在するディレクトリを教えてくれる。ansible version 2.4 より使用可能(なので、最初v2.3を使っていて数分ハマった)。
- 今回の話題。
- vmware_guest_facts module
- VMの設定値を取得できる
- これはVMのリソース設定が正しく設定できているかの確認に使える(assetsモジュールと組み合わせる)。
コードとハマリどころ
コード
# 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文言が変わっても実行しないという安全側に倒れるので良い
コメント
- ちょっと美しくないが、とりあえず動くVM作成と、事故らない動きを実現した話。
- 社内ユーザの要望の声が大きければ enable_modify などのフラグを指定した時にはVMリソース設定や細かい設定を変えさせるのはやっても良いかもしれない。