vmware
ESXi
Ansible
VMware_vSphere

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
    • 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リソース設定や細かい設定を変えさせるのはやっても良いかもしれない。